熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

用FileSystemWatcher對象監控C#目錄改變

2013-11-13 10:26:23  來源: .NET編程 

  許多情況下如果創建或修改一個文件系統需要執行某些任務例如在一個數據庫中插入平面文件的重要系統就是如此

  在這種情況下程序必須監控目錄中新建立的文件如果目錄中新建了一個文件程序必須提取這個文件進行解析再把它插入到數據庫中

  許多時候這類功能要通過調查目錄並列舉上次調查後任何新建的文件來完成NET Framework中微軟為開發者提供另一種連續調查一個目錄中的新建文件的方法——FileSystemWatcher對象

  FileSystemWatcher對象為你完成目錄監控工作如果新建更新或刪除一個文件FileSystemWatcher將提交一個事件通知你發生了一項改變這樣新建一個文件後你的程序立即就知道可以使用這個文件立即通知改變使得你的系統以更高的效率工作因為你不能總是調查目錄中發生的改變而且在兩次目錄掃描之間也不會有時間流失

  FileSystemWatcher基礎

  在應用FileSystemWatcher對象之前你必須了解這個對象的一些基本屬性和事件毫無疑問這個對象的最重要的屬性為EnableRaisingEvents屬性

  這個屬性決定對象在收到改變通知時是否提交事件如果EnableRaisingEvents屬性設為假對象將不會提交改變事件如果設為真它將提交改變事件下面是你在應用FileSystemWatcher對象時將要用到的其它一些重要屬性/事件

  屬性


Path——這個屬性告訴FileSystemWatcher它需要監控哪條路徑例如如果我們將這個屬性設為C:Temp對象就監控那個目錄發生的所有改變
IncludeSubDirectories——這個屬性說明FileSystemWatcher對象是否應該監控子目錄中發生的改變
Filter——這個屬性允許你過濾掉某些類型的文件發生的變化例如如果我們只希望在TXT文件被修改/新建/刪除時提交通知可以將這個屬性設為*txt在處理高流量或大型目錄時使用這個屬性非常方便

  事件


Changed——當被監控的目錄中有一個文件被修改時就提交這個事件值得注意的是這個事件可能會被提交多次即使文件的內容僅僅發生一項改變這是由於在保存文件時文件的其它屬性也發生了改變
Created——當被監控的目錄新建一個文件時就提交這個事件如果你計劃用這個事件移動新建的事件你必須在事件處理器中寫入一些錯誤處理代碼它能處理當前文件被其它進程使用的情況之所以要這樣做是因為Created事件可能在建立文件的進程釋放文件之前就被提交如果你沒有准備正確處理這種情況的代碼就可能出現異常
Deleted——當被監控的目錄中有一個文件被刪除就提交這個事件
Renamed——當被監控的目錄中有一個文件被重命名就提交這個事件

  注如果你沒有將EnableRaisingEvents設為真系統不會提交任何一個事件如果有時FileSystemWatcher對象似乎無法工作請首先檢查EnableRaisingEvents確保它被設為真

  事件處理

  當FileSystemWatcher調用一個事件處理器時它包含兩個自變量——一個叫做sender的對象和一個叫做e的FileSystemEventArgs對象我們感興趣的自變量為FileSystemEventArgs自變量這個對象中包含有提交事件的原因以下是FileSystemEventArgs對象的一些屬性

  屬性


Name——這個屬性中使事件被提交的文件的名稱其中並不包含文件的路徑——只包含使用事件被提交的文件或目錄名稱
ChangeType——這是一個WatcherChangeTypes它指出要提交哪個類型的事件其有效值包括
○ Changed
○ Created
○ Deleted
○ Renamed
FullPath——這個屬性中包含使事件被提交的文件的完整路徑包括文件名和目錄名

  代碼實例

  列表A列出了FileSystemWatcher對象的一個簡單應用實例在這個例子中我們監控C:Temp目錄中是否建立了*TXT文件這可能是FileSystemWatcher的最簡單用法

  列表A

  publicvoid CreateWatcher()

  {

  //Create a new FileSystemWatcher

  FileSystemWatcher watcher = newFileSystemWatcher();

  //Set the filter to only catch TXT files

  watcherFilter = *txt;

  //Subscribe to the Created event

  watcherCreated += new

  FileSystemEventHandler(watcher_FileCreated);

  //Set the path to C:Temp

  watcherPath = @C:Temp;

  //Enable the FileSystemWatcher events

  watcherEnableRaisingEvents = true;

  }

  void watcher_FileCreated(object sender FileSystemEventArgs e)

  {

  //A new TXT file has been created in C:Temp

  ConsoleWriteLine(A new *txt file has been created!);

  }

  這篇文章下載版本的樣本項目中還提供了另外一些實例

  應用

  最初FileSystemWatcher的用途可能並不明顯當然如果一個文件或目錄發生改變它會向我們發出警報但在哪些情況下我們需要這類信息呢?

  如果一個系統允許客戶端上傳文件進行處理這時可能就要用到FileSystemWatcher對象盡管很明顯我們已經進入Web服務和SOA時代但許多系統仍然要將平面文件插入到某些位置不管是FTP服務器或網絡共享文件夾中我已經將FileSystemWatcher對象應用到這種類型的系統中雖然並不是完全沒有出錯但它在調查目錄變化方面確實有一定的優勢

  如果你想讓兩個文件保持同步這時也可以用到FileSystemWatcher對象你可以用FileSystemWatcher同時監控這兩個文件的位置如果其中一個出現更新就提交一個Changed事件然後你就可以將這些改變復制到其它系統/文件中

  如果你的系統有任何功能需要進行文件或目錄監控你必須仔細了解那個組件看是否可以使用FileSystemWatcher對象在我的應用過程中這個對象至少為送交給系統的每個文件節省了秒鐘的時間


From:http://tw.wingwit.com/Article/program/net/201311/13620.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.