FileSystemWatcher 是 .NET Framework 中極具實用價值的元件,能即時監控指定目錄或檔案的建立、刪除、修改、重新命名等動作。本文將詳細解析其核心屬性、事件與實際應用範例,助你快速掌握檔案系統監控技術。
設定欲監控的目錄完整路徑,例如 C:\\ 或 D:\\Data。
預設為 false,設為 true 時將連同所有子目錄一併監控。
使用萬用字元指定監控的檔案類型,如 *.txt、*.log 或 *.txt|*.doc|*.jpg 多重過濾。
決定哪些檔案屬性變更會觸發 Changed 事件,可用位元 OR 運算子組合多個條件。常用值包括:
FileName:檔案名稱變更(建立/刪除/重命名)DirectoryName:目錄名稱變更LastWrite:最後寫入時間變更Size:檔案大小變更CreationTime、LastAccess、Attributes、Security 等預設值為 NotifyFilter.LastWrite | NotifyFilter.FileName | NotifyFilter.DirectoryName。
必須設為 true 才會開始監控,預設為 false。
| 事件 | 觸發時機 | 事件參數類型 |
|---|---|---|
| Created | 建立檔案/目錄 | FileSystemEventArgs |
| Deleted | 刪除檔案/目錄 | FileSystemEventArgs |
| Changed | 修改檔案/目錄(依 NotifyFilter 而定) | FileSystemEventArgs |
| Renamed | 重新命名檔案/目錄 | RenamedEventArgs |
Name:受影響檔案/目錄的相對路徑(若遞迴監控,包含子目錄路徑)FullPath:完整絕對路徑ChangeType:變更類型(Created、Deleted、Changed、Renamed、All)OldName、OldFullPath:舊名稱與舊完整路徑private delegate void SetLogTextDelegate(FileSystemEventArgs e);
private delegate void RenamedDelegate(RenamedEventArgs e);
private FileSystemWatcher fsw = new FileSystemWatcher();
private void InitializeWatcher()
{
fsw.Path = @"C:\";
fsw.IncludeSubdirectories = true;
fsw.Filter = "*.txt|*.doc|*.jpg";
fsw.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Size;
fsw.Created += new FileSystemEventHandler(OnFileSystemEvent);
fsw.Deleted += new FileSystemEventHandler(OnFileSystemEvent);
fsw.Changed += new FileSystemEventHandler(OnFileSystemEvent);
fsw.Renamed += new RenamedEventHandler(OnRenamed);
fsw.EnableRaisingEvents = true;
}
private void OnFileSystemEvent(object sender, FileSystemEventArgs e)
{
if (listView1.InvokeRequired)
{
listView1.Invoke(new SetLogTextDelegate(UpdateLog), new object[] { e });
}
}
private void OnRenamed(object sender, RenamedEventArgs e)
{
if (listView1.InvokeRequired)
{
listView1.Invoke(new RenamedDelegate(UpdateRenamedLog), new object[] { e });
}
}
private void UpdateLog(FileSystemEventArgs e)
{
var item = new ListViewItem();
item.SubItems.Add(e.Name);
item.SubItems.Add(e.ChangeType.ToString());
item.SubItems.Add(e.FullPath);
listView1.Items.Add(item);
}
private void UpdateRenamedLog(RenamedEventArgs e)
{
var item = new ListViewItem();
item.SubItems.Add(e.OldName);
item.SubItems.Add(e.ChangeType.ToString());
item.SubItems.Add(e.Name);
item.SubItems.Add(e.OldFullPath);
item.SubItems.Add(e.FullPath);
listView1.Items.Add(item);
}
Control.Invoke 或 BeginInvoke 將 UI 更新封送至主執行緒。RenamedEventArgs,其餘傳遞 FileSystemEventArgs,需分別宣告委派處理。Error 事件(fsw.Error += ...)以捕捉緩衝區溢位等錯誤。fsw.Dispose() 釋放系統資源。FileSystemWatcher 提供了強大且易用的檔案系統監控能力,掌握其屬性、事件與跨執行緒處理技巧,即可輕鬆實現自動備份、即時日誌分析、熱部署觸發等實用功能。實務上請根據具體場景調整 Filter 與 NotifyFilter,平衡效能與完整度。