HANDLE FindFirstChangeNotification( LPCTSTR PathName, BOOL WatchSubTree, DWORD FilterFlags);
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が返される。
/* 指定されたディレクトリツリーのファイル名/ディレクトリ名の変更や、作成・削除を検出する(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);
}