天天看點

使用FileSystemWatcher監視檔案變化

本文轉載:http://www.cnblogs.com/zanxiaofeng/archive/2011/01/08/1930583.html

FileSystemWatcher基礎

屬性:

    Path——這個屬性告訴FileSystemWatcher它需要監控哪條路徑。例如,如果我們将這個屬性設為“C:\test”,對象就監控test目錄下所有檔案發生的所有改變(包括删除,修改,建立,重命名)。

    IncludeSubDirectories——這個屬性說明FileSystemWatcher對象是否應該監控子目錄中(所有檔案)發生的改變。

    Filter——這個屬性允許你過濾掉某些類型的檔案發生的變化。例如,如果我們隻希望在TXT檔案被修改/建立/删除時送出通知,可以将這個屬性設為“*txt”。在處理高流量或大型目錄時,使用這個屬性非常友善。

NotifyFilter——擷取或設定要監視的更改類型。可以進一步的過濾要監控的更改類型,如watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite

           | NotifyFilters.FileName | NotifyFilters.DirectoryName;

事件:

    Changed——當被監控的目錄中有一個檔案被修改時,就送出這個事件。值得注意的是,這個事件可能會被送出多次,即使檔案的内容僅僅發生一項改變。這是由于在儲存檔案時,檔案的其它屬性也發生了改變。

    Created——當被監控的目錄建立一個檔案時,就送出這個事件。如果你計劃用這個事件移動建立的事件,你必須在事件處理器中寫入一些錯誤處理代碼,它能處理目前檔案被其它程序使用的情況。之是以要這樣做,是因為Created事件可能在建立檔案的程序釋放檔案之前就被送出。如果你沒有準備正确處理這種情況的代碼,就可能出現異常。

    Deleted——當被監控的目錄中有一個檔案被删除,就送出這個事件。

    Renamed——當被監控的目錄中有一個檔案被重命名,就送出這個事件。 

注:如果你沒有将EnableRaisingEvents設為真,系統不會送出任何一個事件。如果有時FileSystemWatcher對象似乎無法工作,請首先檢查EnableRaisingEvents,確定它被設為真。

問題:

  程式裡需要監視某個目錄下的檔案變化情況: 一旦目錄中出現新檔案或者舊的檔案被覆寫,程式需要讀取檔案内容并進行處理;但在實際進行中發現當一個檔案産生變化時,Change事件被反複觸發了好幾次。這樣可能的結果是造成同一檔案的重複處理。

解決方法:

  針對上面的問題,于是寫了一個可以延遲FileSystemWatcher發出的事件的Class DelayFileSystemWatcher。

使用FileSystemWatcher監視檔案變化
使用FileSystemWatcher監視檔案變化

使用方式如下:

使用FileSystemWatcher監視檔案變化
使用FileSystemWatcher監視檔案變化