2010-11-27 62 views
4

我想檢測特定文件夾(數據更改除外)上的每個文件更改。我決定使用System.IO.FileSystemWatcher來管理它。C#檢測文件移動通過不同的文件夾

// 
// fileSysWatchFile 
// 
this.fileSysWatchFile.EnableRaisingEvents = true; 
this.fileSysWatchFile.IncludeSubdirectories = true; 
this.fileSysWatchFile.NotifyFilter = System.IO.NotifyFilters.FileName; 
this.fileSysWatchFile.SynchronizingObject = this; 
this.fileSysWatchFile.Created += new System.IO.FileSystemEventHandler(this.fileSysWatchFile_Created); 
this.fileSysWatchFile.Deleted += new System.IO.FileSystemEventHandler(this.fileSysWatchFile_Deleted); 
this.fileSysWatchFile.Renamed += new System.IO.RenamedEventHandler(this.fileSysWatchFile_Renamed); 

只要好...檢測到新文件。文件刪除被檢測到。文件重命名被檢測到。

當我將文件移動到子文件夾時,它首先檢測到文件刪除,然後創建新文件。

我希望移動和重命名一樣,除了路徑。似乎不是。我能否以保存方式檢測文件移動?

順便說一下...我只想檢測文件更改而不是目錄更改。

編輯:

附加信息爲什麼我要檢測動作並不能刪除生活,創建:

我要重播的其他驅動器上進行相同的更改。如果我首先得到刪除,我刪除影子文件。然後我得到的創建文件事件和原來的文件已經失去了:-(。

所以我有一個驅動器A這是看着驅動... 並且具有與相同的文件名文件的驅動器B中。

exept數據變化的所有文件的變化,應該在驅動器B.重播

+0

主要問題是,我不能說刪除和創建事件之間的時間有多長,因爲我不能通過延遲路徑檢查來檢測它,所以無法實現保存解決方法。 – fpdragon 2010-11-27 09:30:28

+0

任何超過幾秒對於一個文件移動來說是一個非常令人驚訝的值,因爲windows真的只是更新了文件路徑,即使它說它是一個delete + create – SWeko 2010-11-27 10:45:34

+0

AFAIK FileSystemWatcher是一個盡力而爲的方法,只有有限的通知緩衝區,通知將會默默地下降。所以當系統忙時,你的應用程序可能會錯過一些事件。 – Daniel 2010-11-27 11:43:51

回答

1

文件刪除/文件創建功能背後是什麼文件之舉。它類似於重命名,如果你只是從一個文件夾移動文件一個文件夾,但是如果將一個文件從一個磁盤移動到另一個磁盤或在計算機之間移動文件怎麼樣?

而且,如果我正在觀看指定的文件夾,只要文件不在那裏,那麼它可能已被刪除:)

如果您確定要捕捉文件移動的「events」(來自一個監視文件夾到一個監視的子文件夾),我會維護一個最近刪除的文件的列表,並在每個文件創建事件時,檢查文件是否是該列表,表明事實上的文件移動。

1

您可以使用文件系統過濾器驅動程序來跟蹤文件重命名操作。實際上,FS Filter比FileSystemWatcher更好。 FileSystemWatcher不提供某些情況下的可靠性和靈活性(您可以看到有關FileSystemWatcher的問題數量以及它的小故障和限制)。

FS過濾器可讓您在請求到達文件系統後立即跟蹤請求。

您可以編寫自己的過濾器驅動程序,或使用我們的CallbackFilter產品。

0

這不是問題的真正解決,但我設法有一個快速和骯髒的解決方案:

首先我緩衝的所有事件的一段時間(100毫秒測試,但我們將看到它的速度有多快)。

如果緩衝區中的事件是100ms,我檢查是否還有其他事件。因此,對於刪除我搜索所有創建和創建我搜索所有刪除。

如果我找到一個我只用一個移動事件來替換兩個事件。

這個workarround有一些riscs:
1.)我不能說什麼先來,刪除或創建。看來,這是每一個不同的時間
2)如果延遲短,文件將被刪除,:-(失去

但只要我有沒有更好的解決辦法,我不得不忍受這一點。

相關問題