2009-01-27 81 views
2

我确定我只是在做一些非常愚蠢的事情而没有看到它,但任何人都可以告诉我为什么下面的代码不会在传入的目录中找到更改?为什么我的ReadDirectoryChangesW不能读取已更改的文件?

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

+1

您可能想要将OVERLAPPED初始化为零。 – MSN 2009-01-27 23:40:02

+0

*叹*,是的,那就是问题所在。谢谢你的帮助。 – mockobject 2009-01-28 20:20:40

回答

3

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

编辑:您可能想要将OVERLAPPED初始化为零。

相关问题