2011-12-01 61 views

回答

1

當使用ReadDirectoryChangesW異步,你會得到事件的第一組,那麼你必須再次調用它更多事件。如果您的緩衝區中的事件數量超過,則不會發生錯誤。在OS級緩衝區中發生的事件多於錯誤狀態,並且您發現如下:

  1. 發生了一些事件。
  2. 通過ReadDirectoryChangesW開始異步操作成功完成。您的緩衝區已滿,事件句柄已設置或IOCP被觸發。
  3. 發生其他事件,這些事件存儲在OS級緩衝區中。
  4. 發生更多附加事件,這些事件溢出OS級緩衝區。這不會改變重疊的操作,已經成功在步驟2
  5. 您等待事件處理,或處理IOCP的狀態,並發現完成OVERLAPPED通話。
  6. 你再打電話ReadDirectoryChangesW開始異步的重疊的操作檢查,因爲第2步此調用同步失敗時發生的任何事件,GetLastError() == ERROR_NOTIFY_ENUM_DIR,或dwBytesTransferred == 0成功,因爲the documentation says this also means to re-enumerate the directory

如果傳輸的字節數爲零,則緩衝區對於系統分配來說太大,或者太小而無法提供有關目錄或子樹中發生的所有更改的詳細信息。在這種情況下,您應該通過枚舉目錄或子樹來計算更改。

+0

聽起來很有趣。這是你的經歷嗎?是否有任何文件指定這種行爲?對於更新的Windows版本,這可能會發生變化嗎?這是5年前我正在研究'ReadDirectoryChangesW'行爲,但我敢肯定,我沒有看到任何錯誤指示通過對'ReadDirectoryChangesW'的同步調用。 – mstrap

+0

@mstrap:其實我並不完全確定#6。該文檔建議它可以用'dwBytesTransferred == 0'完成。我可以肯定的是,這個錯誤將會在隨後的調用中報告,因爲它發生在數據可用於完成第一個調用之後。 –

0

here來看,好像沒有這樣的返回錯誤代碼異步

建議:監控變化同步,而是在一個專門的線程,並觀看了ERROR_NOTIFY_ENUM_DIR

1

您可能無法完成您的檢測這種方式,但here是一個偉大的教程,可以幫助。

您還可以檢查出的答案this other question.