2010-10-19 134 views
2

好吧,所以我從How to check if a open file has been updated瞭解到我應該使用FileSystemWatcher來監視文件的更改。那麼現在,問題是如果我必須跟蹤許多文件,我是否爲每個文件創建1個觀察器?另外,一旦文件關閉,我必須以某種方式處置觀察者。有一個Dictionary<string, FileSystemWatcher>存儲文件路徑和FileSystemWatcher的路要走嗎?當我打開更多文件時,我添加了更多的觀察者,並在我關閉時適當地處理觀察者。會有太多的觀察者是壞事嗎?C#:使用FileSystemWatcher監視文件更改

UPDATE

我只是做了

protected void AttachFileMonitor(EditorTabViewModel tab) 
{ 
    string file = tab.FilePath; 
    if (!_fsWatchers.ContainsKey(file)) 
    { 
     var watcher = new FileSystemWatcher(); 
     watcher.Path = Path.GetDirectoryName(file); 
     watcher.Filter = Path.GetFileName(file); 
     watcher.Changed += (s, e) => 
     { 
      string message = ""; 
      string caption = ""; 
      MessageBoxButton buttons = MessageBoxButton.YesNo; 
      MessageBoxImage image = MessageBoxImage.Question; 
      MessageBoxResult defaultResult = MessageBoxResult.Yes; 
      MessageBoxResult result = _dialogSvc.GetMessageBox(message, caption, buttons, image, defaultResult); 
      if (result == MessageBoxResult.Yes) 
      { 
       tab.Open(file); 
      } 
     }; 
     _fsWatchers.Add(file, watcher); 
    } 
} 
protected void DetachFileMonitor(EditorTabViewModel tab) 
{ 
    if (_fsWatchers.ContainsKey(tab.FilePath)) { 
     _fsWatchers.Remove(tab.FilePath); 
    } 
} 

我發現Changed()從未被觸發...

+0

將EnableRaisingEvents設置爲true :) – Onkelborg 2010-10-19 14:09:02

回答

2

如果您爲每個目錄創建一個觀察者(和可選這是不夠的,你可以讓觀察者監視整個目錄樹。)然後,您可以使用這些事件將已更改的文件與您感興趣的文件列表進行比較。

我建議你爲觀察者製作某種「保姆」類,以確保你不會處理活動觀察者或創建重複。只是一個提示:)

順便說一句,是的,有一個限制,你不能創建無限的觀察者。在特定的情況下,這可能是一個問題,但最有可能的情況是,這不是你的情況

+0

我在想我是否做錯了什麼? 'FileSystemWatcher'似乎不適合我。或者爲什麼很多人警告不要使用它? – 2010-10-19 13:41:55

+0

我在猜測,但您是否將EnableRaisingEvents設置爲true? – Onkelborg 2010-10-19 14:08:02

+0

工作正常,但即使從我的應用程序保存,更改也會提升2次。我讀過這可能會發生,但我怎麼能檢查事件是否已經提出了B4? – 2010-10-20 09:27:13

1

我認爲你絕對是在正確的軌道上。如何存儲多個fileWatchers,但是如何處理它們並儘快清除它們的隊列對於可靠性非常重要。你只需要一個目錄,而不是文件。

有很多關於fileWatchers的不可靠性的帖子,所以要勤於使用。

+0

我不知道我是否做錯了什麼? 'FileSystemWatcher'似乎不適合我。或者爲什麼很多人警告不要使用它? – 2010-10-19 13:42:45

0

這真的是一個權衡。許多觀察者會消耗更多的資源,但是如果您在包含許多文件/子目錄(例如C :)的目錄上有觀察者,這也會消耗大量資源。

如果所有文件都位於一個文件夾中,則應該只使用單個觀察器。

+0

還有一件事需要考慮:觀察者會消耗資源,是的,但它不會被輪詢,而且輪詢在大多數情況下都是邪惡的。閒置和等待某些東西,而不是主動要求某些東西最好。在性能和響應方面,顯然更願意等待而不是提問。 – Onkelborg 2010-10-19 11:13:03

+0

不,它不會被輪詢。但是,它將收到您指定的文件夾結構內的所有更改。特別是當你指定C:\時,你會得到C:\驅動器上的所有活動的通知,這將是很多。 – 2010-10-19 12:02:11

+0

是的,我知道它不會被輪詢,我在談論使用FileSystemWatcher的替代方法:輪詢;)但是如果你指定C:\,那麼不會有太多活動,除非啓用遞歸模式。我試圖做的一點是,輪詢可能比觀察者使用更多的資源。 – Onkelborg 2010-10-19 12:54:07