2010-10-20 75 views
3

這裏是問題:我使用Win32 API ReadDirectoryChangesW函數監視一個目錄。我需要區分新創建的文件和修改後的文件。但也有問題......一如既往:(Win32 C++ ReadDirectoryChangesW文件差異檢測的「創建」和「修改」?

案例:

  1. 我監視新/修改(FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_SIZE問題目錄:文件創建後,新文件事件+修改文件事件但我只需要一個,我該如何避免這種情況?當文件被修改時,我得到我想要的:)。
  2. 我只監視新文件的目錄(FILE_NOTIFY_CHANGE_FILE_NAME) - 沒有問題。
  3. 我僅監視修改文件的目錄(FILE_NOTIFY_CHANGE_SIZE)。 問題:當有新文件時,修改操作會隨着文件創建事件一起被觸發。我怎樣才能避免這種情況?

當然,我實施了一些解決方法。但是,我想知道是否有任何處理我描述的問題的優雅方式。

在此先感謝!

+0

當大小從0變爲非零時,會忽略大小修改嗎? – 2010-10-20 20:28:56

+0

在活動時間我不知道文件大小,我只知道該文件已更改。 – dmitril 2010-10-21 17:23:36

+0

目前唯一有幫助的就是跳過下一個事件,放置1秒的計時器並跳過它。但這是一個解決辦法,而不是解決方案:) – dmitril 2010-10-21 17:27:53

回答

4

對於修改後的文件,您應該捕獲FILE_NOTIFY_CHANGE_LAST_WRITE而不是FILE_NOTIFY_CHANGE_SIZE。文件可能會被修改而不改變大小。

你還應該保持一個變化隊列和他們發生的時間,並且只在過去的1-2秒內沒有變化之後處理隊列。某些應用程序在創建或修改文件時可能會做出非常奇怪的事情,如果您打算在野外使用此代碼,您很可能需要針對流行應用程序的特殊情況。

ReadDirectoryChanges不是最友好的winapi函數之一。您可能無法繞過文件創建接收兩個事件;我不完全確定你是否會在創作時獲得FILE_NOTIFY_CHANGE_LAST_WRITE的額外修改,但我認爲你可能會這樣做。如果隊列方法與創建事件具有相同的時間戳,則使用隊列方法可以輕鬆拋出額外的事件。

+0

在FILE_NOTIFY_CHANGE_LAST_WRITE上,您將獲得3個通知:) – dmitril 2010-10-21 06:27:44