ReadDirectoryChangesWによるディレクトリの監視(C言語)

説明:

ReadDirectoryChangesWによって、“c:\doc\”というディレクトリおよびそのサブディレクトリを監視し、ディレクトリツリー上でファイル名またはディレクトリ名の変更があった場合、変更の結果を表示する。

キーワード:

ReadDirectoryChangesW

サンプルコード:

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 更新)

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