FindFirstChangeNotification ディレクトリの監視

Cの宣言:

HANDLE FindFirstChangeNotification(
	LPCTSTR PathName,
	BOOL WatchSubTree,
	DWORD FilterFlags);

VBの宣言:

Declare Function FindFirstChangeNotification Lib "kernel32" Alias "FindFirstChangeNotificationA" ( _
	ByVal PathName As String, _
	ByVal WatchSubTree As Long, _
	ByVal FilterFlags As Long) As Long

説明:

与えられたディレクトリにおける、ファイルやサブディレクトリの作成、削除、変更などのイベントの監視を行う変更通知オブジェクトを作成し、そのハンドルを返す。ネットワークディレクトリの監視も可能である。

変更通知オブジェクトに対して待機関数を使用することにより、イベントの発生を待機することができる。待機後変更通知オブジェクトがシグナル状態になったら、FindNextChangeNotificationを実行し、監視を継続することができる。監視を終了させるには、FindCloseChangeNotificationを使用する。

監視するディレクトリそのものが削除されてしまった場合は、何のイベントも起こらなくなる。監視するディレクトリ名と同じディレクトリを再度作成したとしても、監視は継続されない。ただし、NT4などで「元に戻す」を行うことによって同名ディレクトリが再度作成した場合は、監視はそのディレクトリに対して継続される。

監視するディレクトリの名前が変更されたり、監視するディレクトリが移動しても、監視は正しく継続される。

FilterFlagsに指定するフラグによって、監視するイベントの種類を指定できる。各々のイベントを別々に監視したい場合、各々のイベントに対応するフラグを指定して各々のFindXXXChangeNotificationを実行後、WaitForMultipleObjectsによって待機する。

引数の意味は、以下の通り。
PathName 監視を行うディレクトリのディレクトリ名
WatchSubTree 監視を、指定したディレクトリのみ行うか、サブディレクトリも含んだディレクトリツリーに対して行うかを指定するフラグ。TRUEの場合、サブディレクトリを含むディレクトリツリーに対して監視が行われる。
FilterFlags どのようなイベントを監視するかを指定するフラグ。後述の表を参照。

FilterFlagsに指定できる値は、以下のフラグの論理和である。
FILE_NOTIFY_CHANGE_FILE_NAME ファイルの追加・削除、ファイル名の変更
FILE_NOTIFY_CHANGE_DIR_NAME ディレクトリの追加・削除、ディレクトリ名の変更
FILE_NOTIFY_CHANGE_ATTRIBUTES 属性の変更
FILE_NOTIFY_CHANGE_SIZE サイズの変更
FILE_NOTIFY_CHANGE_LAST_WRITE 最終書き込み時刻の変更
FILE_NOTIFY_CHANGE_SECURITY セキュリティ属性の変更

戻り値は、変更通知オブジェクトのハンドルである。関数に実行に失敗した場合、NULLが返される。

Cのサンプル:

/* 指定されたディレクトリツリーのファイル名/ディレクトリ名の変更や、作成・削除を検出する(3回まで) */
void DoFindChangeNotification(char *path)
{
	HANDLE hNotify;
	int i;
	
	for(i=0; i<3; i++) {
		if(i==0) {
			hNotify = FindFirstChangeNotification(
				path,
				TRUE, 
				FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME
			);
		} else {
			FindNextChangeNotification(hNotify);
			printf("Next%d\n", a);
		}

		WaitForSingleObject(hNotify, INFINITE);
		printf("作成/削除/名前の変更がされた\n");
	}

	FindCloseChangeNotification(hNotify);
}

(original text:1998/12/25 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。