星期一, 11月 17, 2014

[C#] 檔案系統監視

論壇問題上看見這個 FileSystemWatcher 這個功能,趕快找資料來了解並筆記

官方文件 - 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;
        }

    }
}

沒有留言:

張貼留言