本文是关于如何使用AutoIt语言的高级特性来接收操作系统的文件系统通知,并实现文件的自动备份功能的介绍。AutoIt是一种类似于BASIC的脚本语言,最初设计用于自动化Windows GUI的交互。它支持解释执行和编译执行,并且提供了丰富的库来访问COM对象和创建图形界面。
在前两篇文章中,探讨了如何使用COM对象从MSWord文档中抓取数据,并通过WinHttpRequest COM对象发送到互联网应用程序。此外,还介绍了如何使用PowerPoint的COM对象的属性和方法。本文将在此基础上,进一步介绍如何注册系统消息,以便在文件系统发生变化时接收通知,并实现文件的自动备份。
在AutoIt中,可以通过注册一个系统消息来接收文件系统的通知。这个系统消息应该是系统中唯一的字符串。例如,可以使用_WinAPI_RegisterWindowMessage函数来注册一个消息。然后,需要将这个系统消息与一个AutoIt函数关联起来,以便在接收到通知时执行相应的操作。
以下是一个示例程序,展示了如何注册系统消息并关联到一个AutoIt函数:
Local $iMsg = _WinAPI_RegisterWindowMessage('CHANGENOTIFY')
GUIRegisterMsg($iMsg, 'WM_CHANGENOTIFY')
$g_iID = _WinAPI_ShellChangeNotifyRegister($hWnd, $iMsg, $SHCNE_ALLEVENTS, BitOR($SHCNRF_INTERRUPTLEVEL, $SHCNRF_SHELLLEVEL, $SHCNRF_RECURSIVEINTERRUPT), $Path)
在这个示例中,首先注册了一个名为'CHANGENOTIFY'的系统消息,然后将其与一个名为WM_CHANGENOTIFY的AutoIt函数关联起来。接着,使用_WinAPI_ShellChangeNotifyRegister函数注册了一个窗口,以便在文件系统发生变化时接收通知。
备份程序的核心功能是在文件被修改时自动备份这些文件。用户可以通过一个表单选择要备份的文件、备份位置以及是否对备份文件进行加密。这个加密选项对于那些不信任云存储的用户来说非常有用。
以下是备份程序的实现步骤:
Func genGuard($data)
Local $sDrive = "", $sDir = "", $sExtension = "", $Path = "", $file = ""
$psw = $data.item("Password")
$fileToGuard = $data.item("File")
Local $aPathSplit = _PathSplit($fileToGuard, $sDrive, $Path, $File, $sExtension)
$destFolder = $data.item("Folder")
If StringRight($destFolder, 1) <> "\" Then $destFolder = $destFolder & "\"
$Path = $sDrive & $Path
Local $dataFile[] = [$Path, $destFolder, $psw, 0, $File & $sExtension]
If $data.item("runProgram") = "1" Then ShellExecute($data.item("File"), @SW_MAXIMIZE)
If isNewFolder($Path) Then
Local $iMsg = _WinAPI_RegisterWindowMessage('UPDATENOTIFY' & $fileDict.count)
GUIRegisterMsg($iMsg, 'WM_UPDATENOTIFY')
$dataFile[3] = _WinAPI_ShellChangeNotifyRegister($data.item("fg_winhandle"), $iMsg, $SHCNE_UPDATEITEM, BitOR($SHCNRF_INTERRUPTLEVEL, $SHCNRF_SHELLLEVEL, $SHCNRF_RECURSIVEINTERRUPT), $Path)
If @error Then MsgBox(BitOR($MB_ICONERROR, $MB_SYSTEMMODAL), 'Error', 'Window does not registered.') Exit
EndIf
ConsoleWrite("Folder " & $path & " guarded" & @CRLF)
$fileDict.Item($fileToGuard) = $dataFile
EndFunc
在这个函数中,首先获取了要备份的文件路径和目标备份文件夹。然后,检查了目标备份文件夹是否存在,如果不存在,则创建一个新的消息并将其与WM_UPDATENOTIFY函数关联起来。接着,使用_WinAPI_ShellChangeNotifyRegister函数注册了一个窗口,以便在文件系统发生变化时接收通知。
除了自动备份功能外,程序还提供了一些其他功能,例如恢复加密文件和显示当前受保护的文件列表。用户可以通过菜单中的“显示受保护”子菜单来查看当前受保护的文件列表。
Func showGuard()
$aDict = getIniFormat($fileDict)
Local $iOrgWidth = 500, $iHeight = 300
Local $hGUI = GUICreate("Files on guard", $iOrgWidth, $iHeight)
Local $aiGUISize = WinGetClientSize($hGUI)
Local $idListview = GUICtrlCreateListView(StringFormat("File %40s |Folder %40s |Encript key", "", ""), 10, 10, 480, 240)
For $i = 1 To $aDict[0][0]
$a = $aDict[$i][1]
Local $idItem = GUICtrlCreateListViewItem($aDict[$i][0] & "|" & $a[1] & "|" & $a[2], $idListview)
Next
GUISetState(@SW_SHOW, $hGUI)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd
GUIDelete()
EndFunc