AutoIt语言高级特性:操作系统文件系统通知与备份

本文是关于如何使用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
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485