2010-05-09 45 views
7

有沒有人有任何想法如何我可以可靠地禁用FileSystemWatcher對象,當我的應用程序對目錄中的文件進行更改時,這樣我只能看到外部對目錄的更改?爲特定更新禁用FileSystemWatcher?

我已經嘗試設置EnableRaisingEvents在執行寫操作之前立即將其設置爲真,但它似乎此方法不可靠,偶爾我仍然會觸發事件。

我唯一能想到的其他事情是在執行寫操作之後等待少量時間,讓操作系統在重新啓用FSW之前完成目錄的修改,但這看起來很駭人,不喜歡它。


要添加到,該目錄包括潛在的許多文件的問題,身份這些都超出了我的知識和控制,所以我不能只是等待事件觸發特定的文件,然後忽略它。在一次修改之後可能會有任意數量的FSW事件觸發(因爲潛在的許多文件正在更新)。

+0

我不明白你爲什麼不能忽略你正在修改的文件的事件 - 你會知道你修改過的文件的路徑,爲什麼不在短時間內忽略該文件的事件你修改完畢後的時間? – 2010-05-09 02:59:44

+0

你可以在觀察者上設置一個NotifyFilter來過濾掉通知嗎? – 2010-05-09 03:03:07

+0

我已經看過NotifyFilter,但從我所看到的並不是那麼有用。 @Daniel,我不知道具體的文件路徑,因爲它們是由我的控制庫(Lucene.net)創建的。 – devios1 2010-05-09 03:23:02

回答

5

您無法使用.NET API執行此操作。

正如多位用戶指出的那樣,您可能會更好地維護您所做的更改列表,並從您觀察到的更改集中減去它們。

你也可以使用Win32級別的API,如果我沒有弄錯的話,它給你一個進程進行PID的改變(不確定這一點,我寫了一個驅動程序,在此之前做了這個(還有更多)在內核空間內)。

更新:我在與該項目合作的團隊中打電話給他人,他們確認我們只在內核空間中擁有PID。

+0

現在,如果我能確定過程 - 那麼我就可以檢查它是否是我。你記得Win32中鉤子或函數的名字嗎? – devios1 2010-05-09 12:35:33

+0

Shachar,這似乎並非如此。我沒有看到任何使用FindFirstChangeNotification或ReadDirectoryChangesW獲取進程ID的方法。 現在,如果我可以以某種方式接收事件,當我的進程獲得文件句柄時,我可以檢查該文件是否在目錄中,並忽略它的更改,但我找不到任何方法來做到這一點。 :( – devios1 2010-05-09 23:16:32