ファイルやフォルダの監視 <TOP>
指定したフォルダ(サブフォルダを含む)やファイルの追加・削除等の変更を通知します。
FindFirstChangeNotification ファイル変更通知オブジェクトのハンドルを作成
FindNextChangeNotification 次のファイル通知を要求
FindCloseChangeNotification 変更通知オブジェクトのハンドルを解放
WaitForMultipleObjects 複数のオブジェクトがシグナル状態になるか、一定時間を経過するまで待機
エクスプローラ等でフォルダおよびファイルの追加、削除を実行することにより下記のように表示されます。
'================================================================ '= フォルダ・ファイルの監視
'= (FindFirstChangeNotification.bas) '================================================================ #include "Windows.bi" ' ファイル変更通知オブジェクトのハンドルを作成 Declare Function Api_FindFirstChangeNotification& Lib "kernel32" Alias "FindFirstChangeNotificationA" (ByVal lpPathName$, ByVal bWatchSubtree&, ByVal dwNotifyFilter&) ' 次のファイル変更通知を要求 Declare Function Api_FindNextChangeNotification& Lib "kernel32" Alias "FindNextChangeNotification" (ByVal hChangeHandle&) ' 変更通知オブジェクトのハンドルを開放 Declare Function Api_FindCloseChangeNotification& Lib "kernel32" Alias "FindCloseChangeNotification" (ByVal hChangeHandle&) ' 複数のオブジェクトがシグナル状態になるか、一定時間を経過するまで待機 Declare Function Api_WaitForMultipleObjects& Lib "kernel32" Alias "WaitForMultipleObjects" (ByVal nCount&, lpHandles&, ByVal bWaitAll&, ByVal dwMilliseconds&) #define FILE_NOTIFY_CHANGE_ATTRIBUTES &H4 '属性の変更 #define FILE_NOTIFY_CHANGE_DIR_NAME &H2 'ディレクトリの追加・削除、ディレクトリ名の変更 #define FILE_NOTIFY_CHANGE_FILE_NAME &H1 'ファイルの追加・削除、ファイル名の変更 #define FILE_NOTIFY_CHANGE_LAST_WRITE &H10 '最終書き込み時刻の変更 #define FILE_NOTIFY_CHANGE_SECURITY &H100 'セキュリティ属性の変更 #define FILE_NOTIFY_CHANGE_SIZE &H8 'サイズの変更 #define INVALID_HANDLE_VALUE -1 '見つからない場合 #define INFINITE &HFFFF ' #define WAIT_ABANDONED &H80 '全オブジェクトを待っている場合には、すべてのオブジェクトがシグナル状態になり、その中に放棄されたためにシグナル状態になったミューテックスが含まれていることを示す #define WAIT_FAILED &HFFFFFFFF 'エラーが発生したことを示す #define WAIT_OBJECT_0 &H0 '全オブジェクトを待っている場合には、すべてのオブジェクトがシグナル状態になったことを示す #define WAIT_TIMEOUT &H102 'タイムアウト時間が経過したことを示す Var Shared flg As Integer Var Shared Text1 As Object Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14 '================================================================ '= '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start() Var hNotify(1) As Long Var WaitStatus As Long Var Ret As Long Text1.SetWindowText "フォルダ・ファイルの変更を監視しています!" 'ファイルの追加・削除、ファイル名の変更 hNotify(0) = Api_FindFirstChangeNotification("C:\", True, FILE_NOTIFY_CHANGE_FILE_NAME) If hNotify(0) = INVALID_HANDLE_VALUE Then Text1.SetWindowText "ファイルが見つかりません!" GoSub *Msg Exit Sub End If 'ディレクトリの追加・削除、ディレクトリ名の変更の監視 hNotify(1) = Api_FindFirstChangeNotification("C:\", True, FILE_NOTIFY_CHANGE_DIR_NAME) If hNotify(1) = INVALID_HANDLE_VALUE Then Text1.SetWindowText "ディレクトリが見つかりません!" GoSub *Msg Exit Sub End If Do CallEvent '指定のフォルダが変更されるまで待機 WaitStatus = Api_WaitForMultipleObjects(2, hNotify(0), False, 10) Select Case WaitStatus Case WAIT_OBJECT_0 'すべてのオブジェクトがシグナル状態 Text1.SetWindowText "ファイルの変更がありました!" GoSub *Msg 'ファイル変更通知オブジェクトのハンドルの作成と解放 Ret = Api_FindCloseChangeNotification(hNotify(0)) hNotify(0) = Api_FindFirstChangeNotification("C:\", True, FILE_NOTIFY_CHANGE_FILE_NAME) Case WAIT_OBJECT_0 + 1 'WAIT_OBJECT_0 + nCount に設定した条件で復帰 Text1.SetWindowText "フォルダの変更がありました!" GoSub *Msg 'フォルダ変更通知オブジェクトのハンドルの作成と解放 Ret = Api_FindCloseChangeNotification(hNotify(1)) hNotify(1) = Api_FindFirstChangeNotification("C:\", True, FILE_NOTIFY_CHANGE_DIR_NAME) End Select Loop Until flg = True 'ハンドルの解放 Ret = Api_FindCloseChangeNotification(hNotify(0)) Ret = Api_FindCloseChangeNotification(hNotify(1)) Exit Sub *Msg Wait 100 Text1.SetWindowText "フォルダ・ファイルの変更を監視しています!" Return End Sub '================================================================ '= '================================================================ Declare Sub MainForm_QueryClose edecl () Sub MainForm_QueryClose() flg = True End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End