Win32API ファイルシステムの変更を検知する FindFirstChangeNotification FindNextChangeNotification FindCloseChangeNotification

ファイルやディレクトリの名前や属性、サイズ、書き込み日時、セキュリティ属性変更の変更を検知する



使用するAPI

  • FindFirstChangeNotification

  • FindNextChangeNotification

  • FindCloseChangeNotification
  • HANDLE FindFirstChangeNotification(
      LPCTSTR lpPathName,    // 監視するディレクトリの名前へのポインタ
      BOOL bWatchSubtree,    // ディレクトリやディレクトリツリーの監視用の
                             // フラグ
      DWORD dwNotifyFilter   // 監視のためのフィルタ条件
    );


    dwNotifyFilterに設定可能な定数

    FILE_NOTIFY_CHANGE_FILE_NAME監視中のディレクトリ、またはサブツリーでファイル名が変更されると、変更通知の待機操作から制御が戻る。ファイル名の変更とは、ファイル名の再作成( 変更)、作成、削除を指す。
    FILE_NOTIFY_CHANGE_DIR_NAME監視中のディレクトリ、またはサブツリーでディレクトリ名が変更されると、変更通知の待機操作から制御が戻る。ディレクトリ名の変更とは、ディレクトリの作成と削除を指。
    FILE_NOTIFY_CHANGE_ATTRIBUTES監視中のディレクトリ、またはサブツリーで属性が変更されると、変更通知の待機操作から制御が戻る。
    FILE_NOTIFY_CHANGE_SIZE監視中のディレクトリまたはサブツリーでファイルサイズが変更されると、変更通知の待機操作から制御が戻る。
    FILE_NOTIFY_CHANGE_LAST_WRITE監視中のディレクトリまたはサブツリーでファイルに対する前回の書き込み日時が変更されると、変更通知の待機操作から制御が戻る。


    #include <windows.h>
    
    int main()
    {
    	char *lpPathName = "C:\\";
    	HANDLE hNotif;
    	DWORD dwFilter;
    
    	dwFilter = 
    		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;
    	
    	hNotif = FindFirstChangeNotification(
    		lpPathName, 
    		TRUE, 
    		dwFilter);
    
    	if (hNotif == INVALID_HANDLE_VALUE) {
    		printf("FindFirstChangeNotification failed\n");
    		return 1;
    	}
    
    	do {
    		printf("Waiting...\n");
    		WaitForSingleObject(hNotif, INFINITE);	
    		printf("Change Notice\n");
    	} while (FindNextChangeNotification(hNotif));
    
    	FindCloseChangeNotification(hNotif);
    
    	return 0;
    }