2

我确定我只是在做一些非常愚蠢的事情而没有看到它,但是谁能告诉我为什么下面的代码不会在传入的目录中获取更改?

调用此代码时,忽略在传入的 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,
    &notifyInfo,
    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 的东西?

4

1 回答 1

3

你检查了返回值吗?这是通过网络吗?

编辑:您可能希望将 OVERLAPPED 初始化为零。

于 2009-01-27T16:41:38.867 回答