我确定我只是在做一些非常愚蠢的事情而没有看到它但是有人能告诉我为什么以下代码不会在传入的目录中获取更改?
调用此代码时,将忽略在传入的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的东西?
答案 0 :(得分:3)
你检查了返回值吗?这是通过网络吗?
编辑:您可能希望将OVERLAPPED初始化为零。