官方文件 - FileSystemWatcher 類別 備註說明
Windows 作業系統會在所建立的緩衝區中通知您檔案變更的元件 FileSystemWatcher 。 如果短時間內有許多變更,緩衝區可能會溢位。 這會導致元件無法追蹤目錄中的變更,而且只會提供總通知。 使用屬性來增加緩衝區的大小 InternalBufferSize 會很昂貴,因為它來自無法交換至磁片的非分頁式記憶體,因此請將緩衝區保持在夠大的小,而不會遺漏任何檔案變更事件。 若要避免緩衝區溢位,請使用 NotifyFilter 和 IncludeSubdirectories 屬性,讓您可以篩選掉不必要的變更通知。
Code
using System;
using System.IO;
using System.Windows.Forms;
namespace FileMonitor
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
txtLog.Multiline = true;
txtLog.Dock = DockStyle.Bottom;
// 預設監視資料夾
txtPath.Text = @"D:\WatchDemo";
// 檔案篩選選項
cboExtension.Items.Add("");
cboExtension.Items.Add("*.txt");
cboExtension.Items.Add("*.jpg");
cboExtension.Items.Add("*.docx");
cboExtension.Items.Add("*.xlsx");
// 預設篩選的副檔名
cboExtension.Text = "*.txt";
}
private void btnBrowse_Click(object sender, EventArgs e)
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
// 預設開啟位置為使用者桌面
fbd.RootFolder = Environment.SpecialFolder.Desktop;
if (fbd.ShowDialog() != DialogResult.OK || string.IsNullOrEmpty(fbd.SelectedPath))
return;
txtPath.Text = fbd.SelectedPath;
}
private void btnRun_Click(object sender, EventArgs e)
{
string path = txtPath.Text;
if (string.IsNullOrEmpty(path))
return;
FileSystemWatcher fsw = new FileSystemWatcher();
//設定監視資料夾
fsw.Path = path;
// 是否包含子目錄,預設為 true
fsw.IncludeSubdirectories = true;
// 設定篩選條件
string extension = cboExtension.Text;
if (!string.IsNullOrEmpty(extension))
fsw.Filter = extension;
// 設定監視檔案變化類型
fsw.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite;
// FileSystemWatcher 偵測事件是否啟動,預設為 true
fsw.EnableRaisingEvents = true;
// 事件觸發時,藉由 delegate 引用 WatchMessage 方法
fsw.Deleted += WatchMessage;
fsw.Changed += WatchMessage;
fsw.Created += WatchMessage;
fsw.Renamed += WatchMessage;
}
private void WatchMessage(object sender, FileSystemEventArgs e)
{
string message = $"檔案 {e.FullPath} 被 {e.ChangeType}";
txtLog.Text += message + Environment.NewLine;
}
}
}
- 參考資料
- 論壇討論
- .NET 網路與 I/O 技術手冊
- FileSystemWatcher 類別
- [VB.NET][C#.NET] 使用 FileSystemWatcher 監看資料夾 是否被變更 -- comment 內建議加上 try catch 來防止 exception 發生
- C# - 使用 FileSystemWatcher 來監控資料夾下的文件 - 搭配 DirectoryInfo 抓出更多資訊
- 監控檔案系統-FileSystemWatcher
沒有留言:
張貼留言