本文轉載: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。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuQWZzUTOhljM0cTO2ATOwATNxMWM1EWYxEjY5ADNlFTNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuQWZzUTOhljM0cTO2ATOwATNxMWM1EWYxEjY5ADNlFTNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
使用方式如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuQWZzUTOhljM0cTO2ATOwATNxMWM1EWYxEjY5ADNlFTNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIml2ZuQWZzUTOhljM0cTO2ATOwATNxMWM1EWYxEjY5ADNlFTNfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.gif)