開局一張圖,在 System.IO
下的 FileSystemWatcher 常用於監視檔案系統的變更,當檔案系統中的檔案或者資料夾被修改會自動觸發相應的回撥事件。
為了能夠了解 FileSystemWatcher 是怎麼運作的,你可以指定一個被監視的資料夾,當被監視的資料夾修改後,大概會觸發如下的一些事件。
Changed: 當檔案或者資料夾已經完成修改時觸發此事件
Created:當檔案或者資料夾已經成功建立觸發此事件
Error:當變更的過程中發生錯誤觸發此事件。
Renamed:當檔案或者資料夾已經成功被重新命名時觸發此事件
建立一個簡單的 file 監視接下來我們在 Visual Studio 中建立一個 Console 程式,用來了解如何進行檔案監視,不過建議把 Console 部署成 Windows Service,這樣方便在系統中常駐監控,一旦被監視的路徑發生變更就會自動發出通知事件。
該說的都說了,接下來一起研究程式碼吧。
static void Main(string[] args) { string path = @"D:\IDG"; MonitorDirectory(path); Console.ReadKey(); }
下面的程式碼片段展示了 MonitorDirectory 方法的內部邏輯,這個方法可用於監視指定的資料夾並且當資料夾變更時觸發事件,可以看到資料夾路徑
是透過引數傳進去的。
private static void MonitorDirectory(string path) { FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(); fileSystemWatcher.Path = path; fileSystemWatcher.Created += FileSystemWatcher_Created; fileSystemWatcher.Renamed += FileSystemWatcher_Renamed; fileSystemWatcher.Deleted += FileSystemWatcher_Deleted; fileSystemWatcher.EnableRaisingEvents = true; }
可以著重瞭解一下上面的 event 是如何被灌入的,而且我還寫了一句 fileSystemWatcher.EnableRaisingEvents = true
, 這是什麼意思呢? 表示當前的路徑正式開始被監控,一旦監控的路徑出現變更,FileSystemWatcher 中的指定事件將會被觸發。
掃一下上面定義的各個 event 事件,分別都定義了該事件的處理函式,比如說:FileSystemWatcher_Created
,FileSystemWatcher_Renamed
,FileSystemWatcher_Deleted
,顯而易見觸發某一個事件就會觸發它的事件處理函式,對吧,具體程式碼如下:
private static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e) { Console.WriteLine("File created: {0}", e.Name); } private static void FileSystemWatcher_Renamed(object sender, FileSystemEventArgs e) { Console.WriteLine("File renamed: {0}", e.Name); } private static void FileSystemWatcher_Deleted(object sender, FileSystemEventArgs e) { Console.WriteLine("File deleted: {0}", e.Name); }
下面是完整的可供參考的程式碼清單。
using System;using System.IO;namespace IDGFileSystemWatcher{ class Program { static void Main(string[] args) { string path = @"D:\IDG"; MonitorDirectory(path); Console.ReadKey(); } private static void MonitorDirectory(string path) { FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(); fileSystemWatcher.Path = path; fileSystemWatcher.Created += FileSystemWatcher_Created; fileSystemWatcher.Renamed += FileSystemWatcher_Renamed; fileSystemWatcher.Deleted += FileSystemWatcher_Deleted; fileSystemWatcher.EnableRaisingEvents = true; } private static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e) { Console.WriteLine("File created: {0}", e.Name); } private static void FileSystemWatcher_Renamed(object sender, FileSystemEventArgs e) { Console.WriteLine("File renamed: {0}", e.Name); } private static void FileSystemWatcher_Deleted(object sender, FileSystemEventArgs e) { Console.WriteLine("File deleted: {0}", e.Name); } }}
假設 IDG
資料夾是在 E 盤內,接下來把 Console 執行起來,然後在 IDG 資料夾內建立一個新檔案,不出意外的話,你會觀察到這個新建的檔名將會出現在 控制檯 上,說明 FileSystemWatcher_Created 被成功觸發,參考下圖: