我确定我只是在做一些非常愚蠢的事情而没有看到它,但是谁能告诉我为什么下面的代码不会在传入的目录中获取更改?
调用此代码时,忽略在传入的 m_directory 中创建和修改文件或目录。但如果我打电话
PostQueuedCompletionStatus( m_hCompletionPort, 0, 0, NULL );
然后 GetQueuedCompletionStatus 正确退出。有谁看到我做错了什么?这是代码:
// create handle to log dir
HANDLE logDirHandle = CreateFile(m_directory,
FILE_LIST_DIRECTORY,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS |
FILE_FLAG_OVERLAPPED,
NULL);
// create the completion port
m_hCompletionPort = CreateIoCompletionPort(logDirHandle, NULL, 0, 1);
// initial registration for changes
DWORD dwBufLength;
FILE_NOTIFY_INFORMATION notifyInfo;
OVERLAPPED overlapped;
ReadDirectoryChangesW(logDirHandle,
¬ifyInfo,
MAX_BUFFER,
TRUE,
FILE_NOTIFY_CHANGE_LAST_WRITE|FILE_NOTIFY_CHANGE_CREATION,
&dwBufLength,
&overlapped,
NULL);
// wait for a change
LPOVERLAPPED lpOverLapped;
ULONG key;
DWORD numBytes;
GetQueuedCompletionStatus(m_hCompletionPort, &numBytes, &key, &lpOverLapped, INFINITE))
编辑:
好的,我认为 ReadDirectoryChangesW() 肯定会返回 TRUE,但事实并非如此。GetLastError() 告诉我错误是 ERROR_INVALID_HANDLE (6)。奇怪的是,logDirHandle 似乎是有效的,并且在调用 CreateFile() 时没有发生错误。
此外,我稍微重构以调用同步 ReadDirectoryChangesW 保持一切相同,除了丢失 OVERLAPPED 的东西,它工作正常。所以我猜我错误地实现了 OVERLAPPED 的东西?