當前位置: 妍妍網 > 碼農

C# 即時監測資料夾變化

2024-03-17碼農

前言

在開發各種應用程式時,我們經常需要對檔案系統中的檔或資料夾進行即時監測,以便在檔內容改變、檔被建立或刪除時能夠及時做出反應。

在 C# 中,System.IO.FileSystemWatcher 類為我們提供了這樣一個強大的功能。

一、引入 FileSystemWatcher 類

首先,在計畫中引入 System.IO 名稱空間,這是使用 FileSystemWatcher 類的前提: using System.IO;

二、建立並配置 FileSystemWatcher 例項

下面是一個簡單的例子,展示了如何建立一個 FileSystemWatcher 例項並設定其監視的目錄、事件型別以及事件處理常式:

public classFileFolderMonitor
{
private FileSystemWatcher _fileWatcher;
publicvoidStartMonitoring(string directoryPath)
{
// 建立 FileSystemWatcher 例項
_fileWatcher = new FileSystemWatcher();
// 設定要監視的目錄路徑
_fileWatcher.Path = directoryPath;
// 設定要監視的更改型別(例如:修改、建立、刪除)
_fileWatcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
// 添加事件處理常式
_fileWatcher.Changed += OnChanged;
_fileWatcher.Created += OnChanged;
_fileWatcher.Deleted += OnChanged;
_fileWatcher.Renamed += OnRenamed;
// 開啟事件監聽
_fileWatcher.EnableRaisingEvents = true;
Console.WriteLine($"已開始監視資料夾: {directoryPath}");
}
privatevoidOnChanged(object source, FileSystemEventArgs e)
{
Console.WriteLine($"檔或資料夾發生變更: {e.FullPath},事件型別: {e.ChangeType}");
}
privatevoidOnRenamed(object source, RenamedEventArgs e)
{
Console.WriteLine($"檔或資料夾被重新命名: 舊路徑 {e.OldFullPath} -> 新路徑 {e.FullPath}");
}
publicvoidStopMonitoring()
{
if (_fileWatcher != null)
{
// 停止引發事件
_fileWatcher.EnableRaisingEvents = false;
// 清理資源
_fileWatcher.Dispose();
_fileWatcher = null;
Console.WriteLine("已停止監視資料夾");
}
}
}










三、使用與註意事項

在上述程式碼中,我們透過呼叫 StartMonitoring 方法啟動了對指定目錄的監視,並且在檔或子目錄發生變化時觸發相應的事件處理器。

NotifyFilter 內容用來定義需要監聽的具體事件型別,如最後寫入時間、檔名和目錄名的變化等。

Changed、Created、Deleted 和 Renamed 四個事件分別對應於檔或資料夾的內容更改、新建、刪除和重新命名操作。

註意事項

  • FileSystemWatcher 類並不能保證事件的即時性或順序性,尤其是在大量並行檔操作的情況下,可能會合並或延遲觸發事件。

  • 使用 FileSystemWatcher 時應確保合理處理資源,特別是當不再需要監視時,應及時呼叫 Dispose 方法釋放資源。

  • 總結來說,System.IO.FileSystemWatcher 是實作檔案系統即時監控的強大工具,只需簡單配置和事件處理,就能讓我們的應用程式具備靈敏響應檔案系統變化的能力。

  • 四、課外探索,彈出檔選擇框

    publicstaticstringSelectFolder(string description = "請選擇一個資料夾:", Environment.SpecialFolder rootFolder = Environment.SpecialFolder.MyComputer)
    {
    using (FolderBrowserDialog folderDialog = new FolderBrowserDialog())
    {
    folderDialog.Description = description;
    folderDialog.RootFolder = rootFolder;
    if (folderDialog.ShowDialog() == DialogResult.OK)
    {
    return folderDialog.SelectedPath;
    }
    }
    returnstring.Empty;
    }

    轉自:承蒙_關照

    連結:cnblogs.com/Z1000W/p/18075896

    - EOF -

    推薦閱讀 點選標題可跳轉

    看完本文有收獲?請轉發分享給更多人

    推薦關註「DotNet」,提升.Net技能

    點贊和在看就是最大的支持❤️