Задача: Необходимо проверять наличие новых файлов в папке «С/1» и копировать их в другую папку.
Для решения этой задачи существует UDF AutoIt, использующая системные утилиты windows:
- ReadDirectoryChangesW — которая извлекает информацию, описывающую изменения в указанном каталоге.
- SHChangeNotifyRegister — регистрирует окно для получения уведомлений от файловой системы или командной консоли, если файловая система поддерживает уведомления.
Сочетание этих двух утилит позволяет контролировать большинство функций ввода-вывода в Windows, в том числе:
- переименование папок и файлов;
- создание папок и файлов;
- редактирование папок и файлов;
- удаление папок и файлов;
- добавление дисков;
- удаление дисков.
Информация по этой UDF FileSystemMonitor можно найти на форуме.
Список функций FileSystemMonitor :
FileSysMonSetup
Синтаксис: FileSysMonSetup($monitor_type = 3, $dir_monitor_path = «C:\», $shell_monitor_path = «»)
Параметры:
$monitor_type — тип мониторинга
-
-
- — Мониторить только директории;
- — Мониторить только оболочки(shell)
- — Мониторить директории и оболочки;
-
$dir_monitor_path — Опционально. Используется для выбора папки мониторинга. По умолчанию это «С\»
$shell_monitor_path — Путь для мониторинга shell. По умолчанию пустой. Это означает что будут отслеживаться общесистемные события оболочки.
Описание:
Изменение пути мониторинга каталогов.
FileSysMonSetDirPath
Синтаксис: _FileSysMonSetDirMonPath($dir_monitor_path = «C:\»)
Параметры:
$dir_monitor_path — необязательно: путь, используемый для мониторинга каталогов. Путь «C:\» используется, если он не предусмотрен.
Описание:
Изменение пути мониторинга каталогов
FileSysMonSetShellMonPath
Синтаксис: _FileSysMonSetShellMonPath($dir_monitor_path = «»)
Параметры:
$dir_monitor_path-необязательно: путь, используемый для мониторинга оболочки. Путь «» используется, если он не предусмотрен.
Описание:
Изменение пути мониторинга Shell
FileSysMonDirEventHandler
Синтаксис: _FileSysMonDirEventHandler()
Описание:
Отслеживает файловую систему на предмет изменений в заданном каталоге. Если происходит событие изменения, вызывается определяемая пользователем функция «_FileSysMonActionEvent».
Эта функция использует функцию операционной системы Win32 «ReadDirectoryChangesW» для слежкой за изменениями в каталоге.
Функция ReadDirectoryChangesW, по-видимому, ставит события в очередь, так что всякий раз, когда она вызывается, все необработанные события извлекаются по одному за раз.
Необходимо вызвать функцию «_FileSysMonSetup» с типом $monitor_type
либо 1, либо 3, перед вызовом этой функции.
Вызов этой функции должен быть вставлен в основной цикл сообщений скрипта на основе графического интерфейса пользователя.
Определяемая пользователем функция для действия событий должна быть создана пользователем в вызывающем скрипте и должна быть определена следующим образом:
1 2 3 |
Func _FileSysMonActionEvent($event_type, $event_id, $event_value) EndFunc |
FileSysMonShellEventHandler
Синтаксис: _FileSysMonShellEventHandler($hWnd, $Msg, $wParam, $lParam)
Параметры:
$hWnd — дескриптор окна графического интерфейса пользователя, в котором появляется сообщение.
$Msg — идентификатор сообщения Windows.
$wParam — первый параметр сообщения в виде шестнадцатеричного значения.
$lParam — второй параметр сообщения в виде шестнадцатеричного значения.
Описание:
Отслеживает события оболочки в файловой системе.
Если каталог был предоставлен в «_FileSysMonSetup», то только события в
этот каталог будет пойман. Если каталог не был предоставлен, то будут пойманы общесистемные события. Эта функция использует функциональность операционной системы Win32 «SHChangeNotifyRegister» для мониторинга системы или каталога на предмет изменений, связанных с оболочкой Windows. Перед вызовом этой функции необходимо вызвать функцию «_FileSysMonSetup» с типом $monitor_type либо 2, либо 3.
Вызов этой функции не требуется. Он запускается автоматически для каждого нового события оболочки. Определяемая пользователем функция для действия событий должна быть создана пользователем в вызывающем скрипте и должна быть определена следующим образом:
Простой пример работы UDF
Следующий пример показывает, как работает эта библиотека. Идет мониторинг папки «C:\1\» и как только в ней происходит событие связанное с созданием, редактированием или удалением файла или папки, то в консоли отобразится соответствующие сообщение.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include <FileSystemMonitor.au3> Global $old_item ; Setup File System Monitoring _FileSysMonSetup(3, "C:\1", "") ; Main Loop While 1 ; Handle Directory related events _FileSysMonDirEventHandler() WEnd Func _FileSysMonActionEvent($event_type, $event_id, $event_value) ConsoleWrite($event_type & "|" & $event_id & "|" & $event_value & @CRLF) Switch $event_type case 0 Switch $event_id Case 0x00000001 ; file / folder added ConsoleWrite("adding file / folder " & $event_value & @CRLF) Case 0x00000002 ; file removed ConsoleWrite("removing file " & $event_value & @CRLF) Case 0x00000004 ; file / folder renamed - old name $old_item = $event_value Case 0x00000005 ; file / folder renamed - new name ConsoleWrite("renaming file " & $old_item & " to " & $event_value & @CRLF) EndSwitch case 1 Switch $event_id Case 0x00000010 ; folder removed ConsoleWrite("removing folder " & $event_value & @CRLF) Case 0x00000100 ; drive added ConsoleWrite("adding drive " & $event_value & @CRLF) case 0x00000080 ; drive removed ConsoleWrite("removing drive " & $event_value & @CRLF) EndSwitch EndSwitch EndFunc |