首頁>技術>

開局一張圖,在 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_CreatedFileSystemWatcher_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 被成功觸發,參考下圖:

13
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 如何使用 C# 中的 Tuple