溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Windows Api+Qt做的一個系統(tǒng)備份工具

發(fā)布時間:2020-07-22 20:12:30 來源:網(wǎng)絡(luò) 閱讀:4538 作者:piaodonkey 欄目:編程語言

使用Windows Api+Qt做的一個系統(tǒng)備份工具

? ? ? ? 重新編輯于2019.05.08,代碼有所改變,詳細信息請參閱附件鏈接,不做詳述

????????由于公司應用大量裝機的情況,以前使用ghost軟件來處理,但是自從uefi模式出現(xiàn)后ghost已經(jīng)不能很好的應用了,雖然現(xiàn)在有Acronis軟件替代,但是生成的備份文件沒有很好的工具去修改,所以遇到需要添加鏡像驅(qū)動和補丁的時候帶來非常大的麻煩。系統(tǒng)自帶的dism工具確實好用,但是每次都需要輸入命令行輸入,效率不能提高。因此根據(jù)現(xiàn)在的實際情況,清明三天假連學帶做了這款窗口版的備份還原工具,功能目前很很簡單,只有備份分區(qū)(文件夾)和還原分區(qū)功能,下一步會添加驅(qū)動添加功能。廢話不說,上代碼。

?//DismTools.h??qt?widget?頭文件
?#pragma?once

#include?<QWidget>
#include?<QThread>

#include?"ui_DismTools.h"
#include?<QString>
#include?<QLabel>
#include?"BackUp.h"
#include?"Restore.h"
#include?"BcdBoot.h"

class?DismTools?:?public?QWidget
{
Q_OBJECT

public:
DismTools(QWidget?*parent?=?Q_NULLPTR);
~DismTools()
{
thread.quit();
thread.wait();
}
private:
Ui::DismToolsClass?ui;
private?slots:
void?on_BackUp_clicked();
void?on_BackUp_finished(const?QString&);
void?on_Restore_clicked();
void?on_Restore_finished(const?QString&);
private:
QThread?thread;
BackUp *bk;
Restore?*restore;
BcdBoot?*boot;
signals:
void?backSig(const?QString?&,const?QString?&);
void?restoreSig(const?QString?&,?const?QString?&);
void?bcdbootSig(const?QString?&);
//PWSTR?pszTmpDir?=?L"C:\\tmp";


};
//dismtools.cpp?代碼
#pragma?execution_character_set("utf-8")

#include?"DismTools.h"
#include?"BackUp.h"
#include?<QFileInfo>
#include?<QFileDialog>

DismTools::DismTools(QWidget?*parent)
:?QWidget(parent)
{
ui.setupUi(this);

connect(ui.backUp,?&QPushButton::clicked,?this,?&DismTools::on_BackUp_clicked);
connect(ui.restore,?&QPushButton::clicked,?this,?&DismTools::on_Restore_clicked);
}
void?DismTools::on_BackUp_clicked()
{


QString?dir?=?QFileDialog::getExistingDirectory(this,?tr("選擇備份分區(qū)"),
"/home",
QFileDialog::ShowDirsOnly
|?QFileDialog::DontResolveSymlinks);


QFileInfo?fi(dir);
if?(!fi.exists())
{
return;
}

QString?fileName?=?QFileDialog::getSaveFileName(this,?QString("保存鏡像文件"),
"/home/",
QString("鏡像文件?(*.wim)"));
QFileInfo?fi1(fileName);


bk?=?new?BackUp();
bk->moveToThread(&thread);
connect(&thread,?&QThread::finished,?bk,?&QObject::deleteLater);
connect(this,?&DismTools::backSig,?bk,?&BackUp::doBackUp);
connect(bk,?&BackUp::resultReady,?this,?&DismTools::on_BackUp_finished);
thread.start();
ui.label->setText("鏡像備份中...");
ui.backUp->setDisabled(true);
emit?backSig(fileName,?dir);

}

void?DismTools::on_BackUp_finished(const?QString?&finished)
{
ui.label->setText(finished);
QMessageBox::warning(this,?"",?finished);
ui.backUp->setDisabled(false);
}

void?DismTools::on_Restore_clicked()
{

QString?dir?=?QFileDialog::getExistingDirectory(this,?tr("選擇恢復分區(qū)"),
"/home",
QFileDialog::ShowDirsOnly
|?QFileDialog::DontResolveSymlinks);


QFileInfo?fi(dir);
if?(!fi.exists())
{
return;
}

QString?fileName?=?QFileDialog::getOpenFileName(this,?QString("選擇鏡像文件"),
"/home/",
QString("鏡像文件?(*.wim)"));
QFileInfo?fi1(fileName);


restore?=?new?Restore();
restore->moveToThread(&thread);
connect(&thread,?&QThread::finished,?restore,?&QObject::deleteLater);
connect(this,?&DismTools::restoreSig,?restore,?&Restore::doRestore);
connect(restore,?&Restore::resultReady,?this,?&DismTools::on_Restore_finished);
thread.start();
ui.label->setText("鏡像恢復中...");
ui.restore->setDisabled(true);
emit?restoreSig(fileName,?dir);
}

void?DismTools::on_Restore_finished(const?QString?&finished)
{
ui.label->setText(finished);
QMessageBox::warning(this,?"",?finished);
ui.restore->setDisabled(false);
int?ret?=?QMessageBox::question(this,?"",?QString("是否添加引導項?"),?QMessageBox::Ok,QMessageBox::No);
if?(ret?=?0)
{
QString?souces?=?QFileDialog::getExistingDirectory(this,?tr("選擇Windows系統(tǒng)根目錄"),
"/home",
QFileDialog::ShowDirsOnly
|?QFileDialog::DontResolveSymlinks);



QString?bootPath?=?QFileDialog::getExistingDirectory(this,?tr("選擇Windows啟動分區(qū)"),
"/home",
QFileDialog::ShowDirsOnly
|?QFileDialog::DontResolveSymlinks);
boot?=?new?BcdBoot();
boot->doBcdBoot(souces,?bootPath);
connect(boot,?&BcdBoot::resultReady,?this,?[=](const?QString?&result)
{
QMessageBox::information(this,?"",?result);
});
return;
}

}

//backup代碼
#pragma?once
#pragma?execution_character_set("utf-8")
#include?<qobject.h>
#include?<QString>
#include?<QMessageBox>
#include?"windows.h"
#include?"wimgapi.h"
class?BackUp:public?QObject
{
Q_OBJECT

public?slots:
void?doBackUp(const?QString?&pszWimFile,const?QString?&pszCaptureDir);
signals:
void?resultReady(const?QString?&result);
};

????????

//backup.cpp
#include?"BackUp.h"

#include?<QMessageBox>

void?BackUp::doBackUp(const?QString?&pszWimFile,?const?QString?&pszCaptureDir)
{

bool?sucess?=?true;
const?wchar_t?*?WimFile?=?reinterpret_cast<const?wchar_t?*>(pszWimFile.utf16());
const?wchar_t?*?CaptureDir?=?reinterpret_cast<const?wchar_t?*>(pszCaptureDir.utf16());
DWORD?dwFlags?=?0,
dwDisposition?=?WIM_CREATE_ALWAYS,
dwDesiredAccess?=?WIM_GENERIC_WRITE,
dwCreateFlags?=?0,
dwCaptureFlags?=?WIM_FLAG_VERIFY,
dwCompressionType?=?WIM_COMPRESS_LZX,
dwCreationResult?=?0,
dwError?=?0;
HANDLE????hWim?=?WIMCreateFile(WimFile,
dwDesiredAccess,
dwDisposition,
dwCreateFlags,
dwCompressionType,
&dwCreationResult);
sucess?=?hWim;
if?(!sucess)
{
//QMessageBox::critical(this,?QString("Error!"),?QString("BackUp?Error?with?code?Create?Fail"));
//QMessageBox::critical(NULL,?QString("Error!"),?QString("Create?Image?Fail"));
emit?resultReady(QString("文件創(chuàng)建失敗"));
return;
}


//WIMSetTemporaryPath(hWim,?pszTmpDir);
HANDLE?hImage?=?WIMCaptureImage(hWim,?CaptureDir,?dwCaptureFlags);
sucess?=?hImage;
if?(!sucess)
{
//QMessageBox::critical(NULL,?QString("Error!"),?QString("BackUp?Error?with?code?BackUp?Status"));
emit?resultReady(QString("備份失敗"));
return;
}

WIMCloseHandle(hImage);

WIMCloseHandle(hWim);
emit?resultReady(QString("備份成功"));
}
}

????????????bcdboot 代碼就不貼了,簡單的都不不好意思。。。


附件有詳細代碼? 測試環(huán)境? vs2017+qt msvc2017 +wadk環(huán)境,由于制作內(nèi)部使用,因此界面比較丑陋,有時間優(yōu)化吧


????????運行效果圖使用Windows Api+Qt做的一個系統(tǒng)備份工具使用Windows Api+Qt做的一個系統(tǒng)備份工具


附件鏈接:代碼

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI