2009-01-27 78 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初始化爲零。

相關問題