次の方法で共有


ReadDirectoryChangesExW 関数 (winbase.h)

指定のディレクトリ内での変更を説明する情報を取得します。ある種類の情報が指定されている場合、それも含めるように拡大されることがあります。 関数は、指定したディレクトリ自体に対する変更を報告しません。

ボリュームでの変更の追跡については、「変更ジャーナル」をご覧ください。

構文

BOOL ReadDirectoryChangesExW(
  [in]                HANDLE                                  hDirectory,
  [out]               LPVOID                                  lpBuffer,
  [in]                DWORD                                   nBufferLength,
  [in]                BOOL                                    bWatchSubtree,
  [in]                DWORD                                   dwNotifyFilter,
  [out, optional]     LPDWORD                                 lpBytesReturned,
  [in, out, optional] LPOVERLAPPED                            lpOverlapped,
  [in, optional]      LPOVERLAPPED_COMPLETION_ROUTINE         lpCompletionRoutine,
  [in]                READ_DIRECTORY_NOTIFY_INFORMATION_CLASS ReadDirectoryNotifyInformationClass
);

パラメーター

[in] hDirectory

監視するディレクトリへのハンドル。 このディレクトリは、FILE_LIST_DIRECTORYアクセス権、または FILE_LIST_DIRECTORY アクセス権 含むGENERIC_READ などのアクセス権 で開く必要があります。

[out] lpBuffer

ReadDirectoryChangesExW が読み取り結果を返す DWORD に配置された書式設定されたバッファーへのポインター。 このバッファーの構造は、ReadDirectoryNotifyInformationClass パラメーターの値が ReadDirectoryNotifyExtendedInformation の場合は FILE_NOTIFY_EXTENDED_INFORMATION 構造体、ReadDirectoryNotifyInformationClass が ReadDirectoryNotifyInformationClass の場合はFILE_NOTIFY_INFORMATION構造体によって定義されます

このバッファーは、ディレクトリの開き方と lpOverlapped パラメーターに指定される値に応じて、同期または非同期に入力されます。 詳細については、「解説」を参照してください。

[in] nBufferLength

lpBuffer パラメーターが指すバッファーのサイズ (バイト単位)。

[in] bWatchSubtree

このパラメーターが TRUE の場合、関数は指定したディレクトリにルート化されたディレクトリ ツリーを監視します。 このパラメーターが FALSE の場合、関数は hDirectory パラメーターで指定されたディレクトリのみを監視します。

[in] dwNotifyFilter

待機操作が完了したかどうかを判断するために関数がチェックするフィルター条件。 このパラメーターには、次の 1 つ以上の値を指定できます。

意味
FILE_NOTIFY_CHANGE_FILE_NAME
0x00000001
監視対象のディレクトリまたはサブツリーでファイル名が変更されると、変更通知の待機操作から制御が戻ります。 変更には、ファイルの名前変更、作成、または削除が含まれます。
FILE_NOTIFY_CHANGE_DIR_NAME
0x00000002
監視対象のディレクトリまたはサブツリーでディレクトリ名を変更すると、変更通知待機操作が返されます。 変更には、ディレクトリの作成または削除が含まれます。
FILE_NOTIFY_CHANGE_ATTRIBUTES
0x00000004
監視対象のディレクトリまたはサブツリーで属性が変更されると、変更通知の待機操作から制御が戻ります。
FILE_NOTIFY_CHANGE_SIZE
0x00000008
監視対象のディレクトリまたはサブツリーでファイル サイズが変更されると、変更通知の待機操作から制御が戻ります。 オペレーティング システムでファイル サイズの変更が検出されるのは、ファイルがディスクに書き込まれたときだけです。 拡張キャッシュを使用するオペレーティング システムでこの変更が検出されるのは、キャッシュが十分にフラッシュされたときだけです。
FILE_NOTIFY_CHANGE_LAST_WRITE
0x00000010
監視対象のディレクトリまたはサブツリーでファイルに対する最終書き込み日時が変更されると、変更通知の待機操作から制御が戻ります。 オペレーティング システムでファイルに対する最終書き込み日時の変更が検出されるのは、ファイルがディスクに書き込まれたときだけです。 拡張キャッシュを使用するオペレーティング システムでこの変更が検出されるのは、キャッシュが十分にフラッシュされたときだけです。
FILE_NOTIFY_CHANGE_LAST_ACCESS
0x00000020
監視対象ディレクトリまたはサブツリー内のファイルの最終アクセス時刻を変更すると、変更通知の待機操作が返されます。
FILE_NOTIFY_CHANGE_CREATION
0x00000040
監視対象ディレクトリまたはサブツリー内のファイルの作成時刻を変更すると、変更通知待機操作が返されます。
FILE_NOTIFY_CHANGE_SECURITY
0x00000100
監視対象のディレクトリまたはサブツリーでセキュリティ記述子を変更すると、変更通知待機操作が返されます。

[out, optional] lpBytesReturned

同期呼び出しの場合、このパラメーターは lpBuffer パラメーターに転送されたバイト数を受け取ります。 非同期呼び出しの場合、このパラメーターは未定義です。 転送されたバイト数を取得するには、非同期通知手法を使用する必要があります。

[in, out, optional] lpOverlapped

非同期操作中に使用するデータを提供する OVERLAPPED 構造体へのポインター。 それ以外の場合、この値は NULL です。 この構造体の Offset メンバーと OffsetHigh メンバーは使用されません。

[in, optional] lpCompletionRoutine

操作が完了または取り消され、呼び出し元スレッドが警告可能な待機状態のときに呼び出される完了ルーチンへのポインター。 この完了ルーチンの詳細については、「 FileIOCompletionRoutine」を参照してください。

[in] ReadDirectoryNotifyInformationClass

lpBuffer パラメーターが指すバッファーに ReadDirectoryChangesExW が書き込む必要がある情報の種類。 ReadDirectoryNotifyInformation を指定して、情報がFILE_NOTIFY_INFORMATION構造体で構成されていることを示すか、ReadDirectoryNotifyExtendedInformation を指定して、情報がFILE_NOTIFY_EXTENDED_INFORMATION構造体で構成されることを示します。

戻り値

関数が成功すると、戻り値は 0 以外になります。 同期呼び出しの場合、これは操作が成功したことを意味します。 非同期呼び出しの場合、これは操作が正常にキューに登録されたことを示します。

関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。

ネットワーク リダイレクターまたはターゲット ファイル システムがこの操作をサポートしていない場合、関数は ERROR_INVALID_FUNCTION で失敗します。

注釈

ディレクトリへのハンドルを取得するには、 CreateFile 関数と FILE_FLAG_BACKUP_SEMANTICS フラグを使用します。

ReadDirectoryChangesExW の呼び出しは、同期または非同期で完了できます。 非同期補完を指定するには、上記のように CreateFile を使用してディレクトリを開きますが、dwFlagsAndAttributes パラメーターに FILE_FLAG_OVERLAPPED 属性を指定します。 次に、ReadDirectoryChangesExW を呼び出すときに OVERLAPPED 構造体を指定します。

ReadDirectoryChangesExW を初めて呼び出すと、システムは変更情報を格納するバッファーを割り当てます。 このバッファーは、閉じられ、その有効期間中にサイズが変更されないまで、ディレクトリ ハンドルに関連付けられます。 この関数の呼び出しの間に発生するディレクトリの変更はバッファーに追加され、次の呼び出しで返されます。 バッファーがオーバーフローしても ReadDirectoryChangesExWtrue を返しますが、バッファーの内容全体は破棄され、 lpBytesReturned パラメーターは 0 になります。これは、発生したすべての変更をバッファーが小さすぎて保持できなかったことを示します。

同期が正常に完了すると、 lpBuffer パラメーターは書式設定されたバッファーであり、バッファーに書き込まれたバイト数は lpBytesReturned で使用できます。 転送されたバイト数が 0 の場合、バッファーが大きすぎてシステムが割り当てられなかったか、小さすぎて、ディレクトリまたはサブツリーで発生したすべての変更に関する詳細情報を提供できませんでした。 この場合は、ディレクトリまたはサブツリーを列挙して変更を計算する必要があります。

非同期完了の場合は、次の 3 つの方法のいずれかで通知を受け取ることができます。

  • GetOverlappedResult 関数を使用する。 GetOverlappedResult 経由で通知を受信するには、lpCompletionRoutine パラメーターに完了ルーチンを指定しないでください。 OVERLAPPED 構造体の hEvent メンバーを一意のイベントに設定してください。
  • GetQueuedCompletionStatus 関数の使用。 GetQueuedCompletionStatus を介して通知を受信するには、lpCompletionRoutine で完了ルーチンを指定しないでください。 CreateIoCompletionPort 関数を呼び出して、ディレクトリ ハンドル hDirectory を完了ポートに関連付けます。
  • 完了ルーチンの使用。 完了ルーチンを介して通知を受信するには、ディレクトリを完了ポートに関連付けないでください。 lpCompletionRoutine で完了ルーチンを指定します。 このルーチンは、スレッドが警告可能な待機状態にある間に操作が完了または取り消されるたびに呼び出されます。 OVERLAPPED 構造体の hEvent メンバーはシステムで使用されないため、自分で使用できます。
詳細については、「 同期および非同期 I/O」を参照してください。

ReadDirectoryChangesExW は、バッファー長が 64 KB を超え、アプリケーションがネットワーク経由でディレクトリを監視している場合に、 ERROR_INVALID_PARAMETER で失敗します。 これは、基になるファイル共有プロトコルのパケット サイズの制限によるものです。

バッファーが DWORD 境界に配置されていない場合、ReadDirectoryChangesExWERROR_NOACCESS で失敗します。

ReadDirectoryChangesExW は、システムがディレクトリに対するすべての変更を記録できなかったときに、 ERROR_NOTIFY_ENUM_DIR で失敗します。 この場合は、ディレクトリまたはサブツリーを列挙して変更を計算する必要があります。

短い名前を使用してファイルを開いた場合は、短い名前の変更通知を受け取ることができます。

ReadDirectoryChangesExW は現在、NTFS ファイル システムでのみサポートされています。

トランザクション操作

ディレクトリ ハンドルにバインドされたトランザクションがある場合、通知は適切なトランザクション分離規則に従います。

要件

要件
サポートされている最小のクライアント Windows 10バージョン 1709 [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2019 [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー winbase.h (Windows.h を含む)
Library Kernel32.lib
[DLL] Kernel32.dll

関連項目

CreateFile

CreateIoCompletionPort

ディレクトリ管理の関数

FILE_NOTIFY_EXTENDED_INFORMATION

FILE_NOTIFY_INFORMATION

FileIOCompletionRoutine

GetOverlappedResult

GetQueuedCompletionStatus

OVERLAPPED

READ_DIRECTORY_NOTIFY_INFORMATION_CLASS