UWSCでディレクトリー内の変更を監視する
ディレクトリー監視をする場合、何が変わったかを知るにはReadDirectoryChangesWを使いますが、、、面倒だったので、Find*ChangeNotification系で。
スクリプト
OPTION EXPLICIT DEF_DLL FindFirstChangeNotificationW(wstring,bool,dword): dword: kernel32 DEF_DLL FindNextChangeNotification(dword): bool: kernel32 DEF_DLL FindCloseChangeNotification(dword): bool: kernel32 DEF_DLL WaitForSingleObject(dword,dword): dword: kernel32 DIM path = ".", hChange, bLoop hChange = FindFirstChangeNotificationW(path, FALSE, $10) bLoop = (hChange <> -1) WHILE bLoop SELECT WaitForSingleObject(hChange, 100) CASE 0 bLoop = FindNextChangeNotification(hChange) IFB bLoop THEN IF MSGBOX("Continue?", BTN_YES OR BTN_NO) = BTN_NO THEN bLoop = FALSE ENDIF CASE 258 // nop DEFAULT bLoop = FALSE SELEND WEND IF hChange <> -1 THEN FindCloseChangeNotification(hChange)
FindFirstChangeNotificationWの第二引数はサブディレクトリを監視するか。
第三引数は、いろいろです。$10はファイルの更新日時。
なお、Windowsの内部バッファを越えて更新があると検知できませんが、、、ま、問題ないでしょう。
監視対象のパスは、"."なのでカレントディレクトリー。
ということで、実行中のスクリプトを変更して保存すると、、、検知すると思います。
ただ、一回の更新で複数回検知すると思います。
例えば、メモ帳で更新すると、2回。
多分、、、ファイルの更新とディレクトリーの更新の二回かと。
秀丸だと、3回検知したりします。
ということで実際には、監視対象の更新日付を待避しておき、本スクリプトのトリガーで現在値と異なれば、処理実行、といった形にすべきかと思います。