引言:系統(tǒng)總有崩潰的時(shí)候,為降低文件丟失的風(fēng)險(xiǎn),把重要的大量文件及時(shí)備份到另一個(gè)磁盤是一項(xiàng)不錯(cuò)的選擇。近期勒索病毒爆發(fā)引起了全球再聚焦信息安全問題。如何盡量增強(qiáng)硬盤中文檔的安全性,筆者提出一種簡(jiǎn)單、實(shí)用也很高效的鏡像熱備份方案,并且備份是隱藏的。
每個(gè)人的計(jì)算機(jī)都存有許多的文檔資料,有的已成為重要資產(chǎn),特別是辦公用計(jì)算機(jī)更是如此。一般用戶每隔數(shù)年總會(huì)因?yàn)橄到y(tǒng)軟件、硬件故障或其他原因而遷移文檔資料,如果所在分區(qū)的磁盤發(fā)生故障則文件丟失。如果遇到類似勒索病毒的破壞情況會(huì)更糟,重要的文檔資料都將丟失。為此,本文提出一種具有鏡像熱備份功能,且將備份目的分區(qū)隱藏的方案。
鏡像備份:備份源區(qū)和目標(biāo)區(qū)的文件名和目錄結(jié)構(gòu)完全一致,便于直觀比較,方便用戶定位要找的文件。
熱備份:備份過程在后臺(tái)自動(dòng)進(jìn)行。用戶可認(rèn)為備份不存在,正常在源區(qū)讀寫文件,不影響用戶操作機(jī)器。
即時(shí)備份:備份程序掃描源區(qū)的時(shí)間間隔2秒。
隱藏備份:在程序控制下,備份目標(biāo)區(qū)只在需要復(fù)制文件時(shí)短暫可見,平時(shí)隱藏,所在分區(qū)不能被訪問,最大限度保證備份文件安全。
為保證正常備份,F(xiàn):分區(qū)的文件不宜太大,應(yīng)保證能在5分鐘內(nèi)復(fù)制完畢。設(shè)置掃描源分區(qū)(F:)時(shí)間間隔為2秒。掃描只關(guān)心近5分鐘內(nèi)修改過的文件,如果存在這樣的文件則進(jìn)一步比較W:分區(qū)是否存在完全一樣的文件,不存在則復(fù)制文件。復(fù)制結(jié)束后,用DeleteVolumeMount PointA("W:\")函數(shù)刪除W:分區(qū)掛載點(diǎn),則W:分區(qū)隱藏不可用,阻止通過系統(tǒng)訪問備份文件。平時(shí)W:分區(qū)一直隱藏,只有F:分區(qū)發(fā)現(xiàn)有5分鐘內(nèi)修改過的文件才通過SetVolumeMountPoi ntA("W:\",szVolumeName)使W:分區(qū)臨時(shí)取消隱藏而可用。在很大程度防止了惡意軟件或非授權(quán)人訪問。
1.以BCB為例,建新應(yīng)用程序,拖放定時(shí)器Timer1,設(shè)置時(shí)間間隔2000。因用到時(shí)間函數(shù),Unit1.cpp頭文件加上#include "DateUtils.hpp"。定義3個(gè)全局變量:String Arr[50000]用于存放5分內(nèi)修改過文件名的數(shù)組,最多可存5萬個(gè)文件名;int P=0用于數(shù)組指針;char szVolumeName[MAX_PATH]=""用于存放W:分區(qū)內(nèi)部標(biāo)識(shí)符。自定義2個(gè)函數(shù) :Find_File(String) 用于遍歷F:分區(qū),Copy_File(String)用于復(fù)制文件。
2.Form1窗體過程
OnShow()過程:
void __fastcallTForm1::FormShow(TObject*Sender)
{ GetVolumeNameForVo lumeMountPointA("W:\",s zVolumeName,MAX_PATH);//獲取W:的內(nèi)部分區(qū)標(biāo)識(shí),存入szVolumeName,以便隱藏和取消隱藏W:分區(qū)的操作

ShowMessage(IntTo Str(aa)+"請(qǐng)手工更改目的分區(qū)符號(hào)為 W:并重啟備份程序");

OnClose()過程:
程序正常關(guān)閉時(shí)取消隱藏W:分區(qū),使W:分區(qū)可見。如果程序異常關(guān)閉,W:分區(qū)隱藏狀態(tài),則下次啟動(dòng)時(shí)OnShow過程提示“手工更改目的分區(qū)符號(hào)為W:”。


3.定時(shí)器過程
首先,定時(shí)器暫停,Arr[]指針P復(fù)位,開始掃描F:分區(qū)。Find_File("F:")返回后,如果P<1,說明沒有需復(fù)制的文件,隱藏W:分區(qū),重啟定時(shí)器并返回。如果P≥1,可能有需復(fù)制的文件,取消W:分區(qū)的隱藏,移動(dòng)P逐個(gè)查找W:分區(qū)中是否存在Arr[]中對(duì)應(yīng)的文件。存在則比較文件寫入時(shí)間與系統(tǒng)時(shí)間的差值,小于120秒是剛剛復(fù)制過的文件放棄復(fù)制,大于120秒的進(jìn)行復(fù)制。如果不存在對(duì)應(yīng)文件,則進(jìn)行復(fù)制。復(fù)制完畢將Arr[]中對(duì)應(yīng)的值清空。Arr[]隊(duì)列處理結(jié)束后,再隱藏W:分區(qū),重啟定時(shí)器。



4.Find_File(String)過程
本過程通過遞歸運(yùn)算遍歷F:分區(qū)所有文件,如果文件5分鐘內(nèi)被修改過,說明文件已更新,可能需要復(fù)制備份。將這些文件裝入隊(duì)列Arr[],P的值就是文件數(shù)量。遍歷完畢等復(fù)制過程。注意一定要過濾“..”目錄,否則遞歸進(jìn)入死循環(huán)。



5.Copy_File(String)過程
本過程使用標(biāo)準(zhǔn)SHFIL EOPSTRUCT文件復(fù)制代碼,較簡(jiǎn)單。需說明復(fù)制前修改Arr[]中文件的路徑,以保證鏡像復(fù)制,代碼為:from=AnsiString(File_Path);to="w:"+File_Path.SubString(3,File_Path.Length());為不干擾用戶正常工作,在后臺(tái)復(fù)制,復(fù)制時(shí)不顯示對(duì)話框,對(duì)已存在文件覆蓋復(fù)制,自動(dòng)新建不存目錄,不顯示復(fù)制進(jìn)度,需設(shè)置fFlags參數(shù)。代碼為:fFlags=FOF_NOERRORUI |FOF_NOCONFIRMATION|FOF_NOCONFIRMMKDIR |FOF_SILENT。