首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

C# FileSystemWatcher 監控檔案系統變更完整教學

     編輯:Java 相關知識

前言

FileSystemWatcher 是 .NET Framework 中極具實用價值的元件,能即時監控指定目錄或檔案的建立、刪除、修改、重新命名等動作。本文將詳細解析其核心屬性、事件與實際應用範例,助你快速掌握檔案系統監控技術。

核心屬性詳解

1. Path(監控路徑)

設定欲監控的目錄完整路徑,例如 C:\\ 或 D:\\Data。

2. IncludeSubdirectories(是否遞迴監控子目錄)

預設為 false,設為 true 時將連同所有子目錄一併監控。

3. Filter(檔案類型過濾)

使用萬用字元指定監控的檔案類型,如 *.txt、*.log 或 *.txt|*.doc|*.jpg 多重過濾。

4. NotifyFilter(觸發通知的屬性變更類型)

決定哪些檔案屬性變更會觸發 Changed 事件,可用位元 OR 運算子組合多個條件。常用值包括:

  • FileName:檔案名稱變更(建立/刪除/重命名)
  • DirectoryName:目錄名稱變更
  • LastWrite:最後寫入時間變更
  • Size:檔案大小變更
  • CreationTime、LastAccess、Attributes、Security 等

預設值為 NotifyFilter.LastWrite | NotifyFilter.FileName | NotifyFilter.DirectoryName。

5. EnableRaisingEvents(啟用監控)

必須設為 true 才會開始監控,預設為 false。

常用事件與事件參數

事件觸發時機事件參數類型
Created建立檔案/目錄FileSystemEventArgs
Deleted刪除檔案/目錄FileSystemEventArgs
Changed修改檔案/目錄(依 NotifyFilter 而定)FileSystemEventArgs
Renamed重新命名檔案/目錄RenamedEventArgs

FileSystemEventArgs 主要屬性

  • Name:受影響檔案/目錄的相對路徑(若遞迴監控,包含子目錄路徑)
  • FullPath:完整絕對路徑
  • ChangeType:變更類型(Created、Deleted、Changed、Renamed、All)

RenamedEventArgs 額外屬性

  • OldName、OldFullPath:舊名稱與舊完整路徑

完整實作範例(WinForms 跨執行緒更新 UI)

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);
}

關鍵技術重點

  1. 多執行緒本質:每個 FileSystemWatcher 實例內部會建立專屬執行緒,事件回呼發生於非 UI 執行緒。
  2. 跨執行緒封送:必須使用 Control.Invoke 或 BeginInvoke 將 UI 更新封送至主執行緒。
  3. 兩種事件參數:重命名事件傳遞 RenamedEventArgs,其餘傳遞 FileSystemEventArgs,需分別宣告委派處理。
  4. 大規模監控策略:若需監控整個磁碟,建議建立 FileSystemWatcher 陣列,每個實例負責一個根目錄,避免單一實例負載過大。

常見陷阱與最佳實務

  • 避免在事件處理常式中執行耗時操作,否則會導致內部緩衝區溢位遺漏事件。
  • 正確處理 Error 事件(fsw.Error += ...)以捕捉緩衝區溢位等錯誤。
  • 網路磁碟監控需注意權限與網路中斷導致的監控失效。
  • 應用結束時務必呼叫 fsw.Dispose() 釋放系統資源。

結語

FileSystemWatcher 提供了強大且易用的檔案系統監控能力,掌握其屬性、事件與跨執行緒處理技巧,即可輕鬆實現自動備份、即時日誌分析、熱部署觸發等實用功能。實務上請根據具體場景調整 Filter 與 NotifyFilter,平衡效能與完整度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved