寫一個自動備份還原的程式


Tek 發表



檔案誤刪或遺失時,讓程式能夠自動偵測此問題,並幫您自動用備份還原!

重要檔案誤刪保護(WSH)
做過網頁的您,通常可能會碰到重要檔案怕被惡意或意外刪除的問題• 例如MDB資料
庫檔案包含著重要帳號密碼資料等其他擁有重要隱私文件的檔案• 防備的防法就是常
製作備份... 但是如果能自動監視且自動備份的話,那就更有效率了!!
(以下程式碼只適用於教學用,並不包含完整的檔案保護工作!)

介紹程式功能、內容
當啟動這一個程式時,程式將會檢驗基本的常數設定及環境一次• 包括:
•檢查是否從Windows (Wscript.EXE) 執行此程式的
•檢查備份的常數以及要受監視的常數內容是否相同
•先檢查要受監視的檔案常數是否在正確的格式
•檢查兩個常數的資料夾/檔案是否存在

在所有設計的檢驗通過後,則會跳出確認視窗讓使用者檢查設定是否正確•如果正確,
則再通知讓使用者程式將會複製備份檔(因為在製作備份時,透過File System Object物件
掃毒程式可能會誤會成這是病毒程式)• 接著,開始備份檔案(就算備份檔存在,也會自
動蓋掉)並啟動監視• 在監視其間如果檔案遭刪除,程式會自動使用之前備份的檔案恢復
且寫下記錄到事件檢視器的"應用程式記錄檔"部份(並繼續監視)• 但是假設連備份檔都
找不到的話,程式將會跑出通知訊息並直接結束進行•

解剖部份程式碼內容
名確的宣告所有變數及常數:
為了要讓所有變數/常數受到宣告,在程式最頂端加上: Option Explicit
如果有變數/常數未受宣告,則會跑出錯誤! (對一個設計者而言,加上Option Explicit
會減少對程式變數設定上的混淆•)

檢查檔案是否存在:
透過File System Object的FileExists方法,只要給允一個路逕字串就可以檢查到該檔案是
否存在• 在這邊,使用同樣的方法程式檢查了備份檔和被監視檔部份•程式碼參考:
Set fso = CreateOjbect("Scripting.FileSystemObject")
If fso.FileExists(orignal_item) = True Then
'...............File does exist...............
Else
'...............File does not exist...............
End If


保持程式監視:
Windows Script Host 本身只有Sleep方法讓程式暫時停止執行,並繼續• 不過我們並不能
使用這一個方法來讓程式在"發呆"的情況下還繼續執行• 基本上,WSH 本身也做不到(沒
提供任何方法)讓程式以這種狀態下執行... 但是透過迴圈方式(Do... Loop),允許了這種狀態
,也就達到了監視的目地• 以下程式碼供參考 (在本文章所提供的防誤刪程式,子程式"
monitor()"為監視功能的程式碼):
Do
Wscript.Sleep 1000 'Delay 一下
Loop

拷貝程式:
在FSO物件,利用Copy方法可以拷貝單一檔案或者是資料夾•以下程式碼供參考:
Dim fso : Set fso = CreateObject("Scripting.FileSystemObject")
Dim x : Set x = fso.GetFile("C:/test.mdb")
x.Copy "A:/test.mdb", True '調成True, 代表程式會自動蓋過同樣的檔案
MsgBox "Done"

MSGBOX 函數使用:
MsgBox(prompt[, buttons][, title][, helpfile, context])
prompt = 要顯示的字串內容
buttons = 顯示您MsgBox出現的類型
title = MsgBox的訊息標題
helpfile = 辨識提供給對方塊文字感應說明的說明檔案的字串運算式
context = 數值運算式,由說明檔案的作者指令適當的說明主題和代碼

常數和變數有何不同?
上過代數或科學課的人應該都知道在數學方面常數代表是用來代表一個固定數字的有意義
名稱(不可更改)•變數則相反(可更改)... 同樣的道理也在程式上! 在這裡提供兩個常數及變數
的使用程式碼範例:
使用變數:
Dim x
x = "Coding is fun, you can create your own stuff! :-)"
Alert(x)

使用常數:
Const x = "Coding is fun, you can create your own stuff! :-)"
Alert(x)


這一個程式主要差不多就是用以上的方式組起來的了,剩下的就直接看程式碼參考囉!

防誤刪程式原始碼內容:
Option Explicit
'-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-'
'''' (Author) Tek (cx@ms74.url.com.tw) ''''
'''' (Website) Http://tek-c.sytes.net ''''
'''' (Program Version) Beta 1.0 ''''
'''' (File Name) delmonitor.VBS ''''
'-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-'
Const orignal_item = "C:/inetpub/wwwroot/access.asp"
Const backup_dir = "C:/inetpub/"
Dim wshexe : wshexe = Right(Wscript.FullName, 11)
Dim getitem(1), asking(1), fso, itemname, wsc
Set fso = CreateObject("Scripting.FileSystemObject")
Set wsc = Wscript
If backup_dir = orignal_item then
with wsc
.echo "備份目錄常數與原目錄檔常數不可相同! 請重新"&_
"設定內容•" & vbcrlf & "注意程式即將自動結束!"
.Quit
end with
Elseif Not UCase(wshexe) = "WSCRIPT.EXE" Then
with wsc
.echo "此程式必須透過Wscript.EXE執行! 請重新設定"&_
"再重新執行這一個程式! (此程式將自動結束)"
.Quit
end with
Elseif Instr(orignal_item, ".") = 0 Then
With wsc
.Echo "非正常的orignal_item 常數設定! 程式無法繼續"&_
"執行• (將自動結束)"
.Quit
End with
Elseif Instr(backup_dir, ".") > 0 Then
with wsc
.Echo "非正常的backup_dir 常數設定! 程式無法繼續"&_
"執行• (將自動結束)"
.Quit
end with
Elseif fso.FileExists(orignal_item) = False Then
with wsc
.echo "指定的監視檔案並不存在,請重新設定!"
.Quit
end with
Elseif fso.folderexists(backup_dir) = False Then
with wsc
.echo "要儲存備份的資料夾不存在,請重新設定!"
.Quit
end with
End If
asking(0) = MsgBox("程式將準備開始進行備份 -> 監視"&_
"動作,請先確定您的設定是否正確(閱讀以下清單),並按"&_
"下是按鈕繼續..." & vbcrlf & vbcrlf & "執行時間:"&_
now() & vbcrlf & "監視檔案:" & orignal_item & vbcrlf,_
vbyesno, "檔案防誤刪程式")
If asking(0) = vbyes Then
asking(1) = MsgBox("程式將會自動備份受監視的檔案,"&_
"請問是否繼續?" & vbcrlf & "(在選擇是前,請確定您"&_
"的掃瞄程式功能已關閉!)", vbyesno, "檔案防誤刪程式")
if asking(1) = vbyes then
Call copyfile(0)
else
with wsc
.echo "程式並無備份您的檔案且將不會自動繼續運作!"
.Quit
end with
end if
Else
wsc.Quit
End If

Public Sub copyfile(ByVal cmode)
Select Case cmode
Case 0
Set getitem(0) = fso.GetFile(orignal_item)
getitem(0).Copy backup_dir & fso.GetFileName(orignal_item)_
, True
MsgBox "備份檔案已經拷貝完畢,請按下確定按鈕開始監視...",_
vbyes, "檔案防誤刪程式"
Call monitor()
Case 1
Dim writelog
If fso.FileExists(backup_dir & fso.GetFileName(orignal_item))_
= True Then
Set getitem(1) = fso.GetFile(backup_dir &_
fso.GetFileName(orignal_item))
getitem(1).Copy orignal_item, True
Dim create_event
Set create_event = Wsc.CreateObject("Wscript.Shell")
create_event.LogEvent 2, "檔案防誤刪程式" & vbcrlf & _
"檔案防誤刪程式所監視的檔案:" & _
orignal_item & "遭刪除,不過已順利備份還原該檔案•"
Call monitor()
Else
MsgBox "受監視的檔案已被刪除且無法備份還原,程式無法繼續"&_
"執行... 請按下確定鈕關閉", vbinformation, "檔案防誤刪程式"
wsc.Quit
End If
End Select
End Sub

Public Sub monitor()
Do while fso.FileExists(orignal_item) = True
Wsc.Sleep 1500
Loop
Call copyfile(1)
End Sub

'-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-'

 

程式使用註解
1)在使用時,擁有Script Blocking功能的防毒程式會誤會所有動用File System Object的Script當作
病毒看待! 不過別擔心,這一支程式不是病毒!
2)在使用前,建議先調整Wscript.Exe的設定修改執行時間(可直接調到無限)•
否則程式無法順利執行!
3)需要確定程式正在監視的話,按下Ctrl+Alt+Delete,在處理程序區可以看到Wscript.Exe•則代表
程式正在監視檔案•
4)請將程式儲存成delmonitor.VBS並直接執行即可

最後更新日期: 2/3/2003 3:01:41 AM