ReadDirectoryChangesW ディレクトリの監視

Cの宣言:

BOOL ReadDirectoryChangesW(
	HANDLE hDir,
	LPVOID Buf,
	DWORD BufSize,
	BOOL bSubTree,
	DWORD Filter,
	LPDWORD RetSize,
	LPOVERLAPPED Overlapped,
	LPOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine);

説明:

hDirで指定されたディレクトリの監視を開始する。

本関数はNT4.0以降で使用可能。

引数の意味は以下の通り。
hDir 監視するディレクトリを識別するファイルハンドル。
Buf 監視の結果が返されるバッファ。バッファの先頭にはFILE_NOTIFY_INFORMATION構造体の形式で結果が返される。
BufSize Bufのサイズ。
bSubTree サブディレクトリも監視の対象とするか否かを表す真偽値。
Filter 監視するイベントを指定するビットマスク値。後述の表を参照。
RetSize 実際にBufに返されたデータのバイトサイズ。
Overlapped 関数を非同期に実行する際に指定するオーバーラップI/Oの構造体。NULLを指定可能。構造体のOffset及びOffsetHighメンバは使用されない。
CompletionRoutine イベント発生時に呼び出される完了ルーチン。完了ルーチンは呼び出し元スレッドがアラート可能な待機状態になった場合に実行される。

Filterに指定可能な値は、以下のフラグの組み合わせである。
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_LAST_ACCESS 最終アクセス時刻の変更を検出する。
FILE_NOTIFY_CHANGE_CREATION 作成時刻の変更を検出する。
FILE_NOTIFY_CHANGE_SECURITY セキュリティ記述子の変更を検出する。

戻り値は、関数の実行に成功したか否かを表す真偽値である。

Cのサンプル:

ReadDirectoryChangesWによって、“c:\doc\”というディレクトリおよびそのサブディレクトリを監視し、ディレクトリツリー上でファイル名またはディレクトリ名の変更があった場合、変更の結果を表示する。
void WatchDir()
{
	BOOL bResult;
	HANDLE hDir;
	BYTE Buf[10000];
	DWORD RetBytes;
	FILE_NOTIFY_INFORMATION *pInfo;
	DWORD i = 0;
	WCHAR FileName[1000];

	hDir = CreateFile(
		L"c:\\doc\\",
		FILE_LIST_DIRECTORY,
		FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
		NULL,
		OPEN_EXISTING,
		FILE_FLAG_BACKUP_SEMANTICS,
		NULL);

	bResult = ReadDirectoryChangesW(
		hDir,
		Buf,
		10000,
		TRUE,
		FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME,
		&RetBytes,
		NULL,
		NULL);

	for(;;) {
		pInfo = (FILE_NOTIFY_INFORMATION *)&Buf[i];
		switch(pInfo->Action) {
		case FILE_ACTION_ADDED: wprintf(L"file added: "); break;
		case FILE_ACTION_REMOVED: wprintf(L"file deleted: "); break;
		case FILE_ACTION_MODIFIED: wprintf(L"time stamp or attribute changed: "); break; 
		case FILE_ACTION_RENAMED_OLD_NAME: wprintf(L"file name changed - old name: "); break;
		case FILE_ACTION_RENAMED_NEW_NAME: wprintf(L"file name changed - new name: "); break;
		default: wprintf(L"unknown event: ");
		}

		lstrcpyn(FileName, pInfo->FileName, pInfo->FileNameLength / sizeof(WCHAR) + 1);
		FileName[pInfo->FileNameLength / sizeof(WCHAR) + 1] = '\0';
		wprintf(L"%s\n", FileName);

		if(pInfo->NextEntryOffset == 0) break;
		i += pInfo->NextEntryOffset;
	};

	CloseHandle(hDir);
}

(original text:1999/04/05 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。