ファイルやフォルダの監視          <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