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回検知したりします。


ということで実際には、監視対象の更新日付を待避しておき、本スクリプトのトリガーで現在値と異なれば、処理実行、といった形にすべきかと思います。