C# FileSystemWatcherで特定のフォルダを監視する

# FileSystemWatcher

特定のフォルダ内において、ファイルが変更・作成・削除されたことを監視するのに便利です。

## イベント

FileSystemWatcher クラスは、Created、Changed、Deleted、Renamed などのイベントがあります。これらのイベントハンドラを使用して、プログラムを実行できます。

## フィルタリングオプション

FileSystemWatcher インスタンスを作成する際に、対象となるディレクトリやファイル、監視するイベントの種類を指定できます。特定の条件に合致する変更のみを監視できます。

~~~cs
FileSystemWatcher watcher = new FileSystemWatcher(@"C:\Path\To\Directory");

// 監視するファイルの種類
watcher.Filter = "*.txt";

// 監視するイベントの設定
watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName;

~~~

## 有効化と無効化

EnableRaisingEvents プロパティを使用して、FileSystemWatcher の有効化と無効化を切り替えることができます。無効化されている間はイベントが発生しません。

## 同期および非同期

FileSystemWatcher イベントは、同期または非同期のいずれかで処理できます。SynchronizingObject プロパティを使用して、イベントハンドラが特定のスレッドで実行されるように設定できます。

## 

<details><summary>サンプルコード</summary>

~~~cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO;

namespace WindowsFormsAppFileWatcher
{
    public partial class Form1 : Form
    {
        FileSystemWatcher watcher;

        public Form1()
        {
            InitializeComponent();
        }

        private void btnWatcher_Click(object sender, EventArgs e)
        {
            //テキストボックスで指定したPathを監視する。
            watcher = new FileSystemWatcher(tbPath.Text);

            // 監視パラメータの設定
            watcher.NotifyFilter = (NotifyFilters.LastWrite
                | NotifyFilters.FileName
                | NotifyFilters.DirectoryName
                | NotifyFilters.Attributes
                | NotifyFilters.CreationTime
                | NotifyFilters.Size
                | NotifyFilters.LastAccess
                | NotifyFilters.Security);

            // サブディレクトリは監視しない
            watcher.IncludeSubdirectories = false;

            watcher.Created += new FileSystemEventHandler(watcher_Created);
            watcher.Changed += new FileSystemEventHandler(watcher_Changed);
            watcher.Error   += new ErrorEventHandler(watcher_Error);
            watcher.Deleted += new FileSystemEventHandler(watcher_Deleted);
            watcher.Renamed += new RenamedEventHandler(watcher_Renamed);

            //WindowFormなどUI用(コンソールでは不要)
            watcher.SynchronizingObject = this;

            watcher.EnableRaisingEvents = true;

            tbMessage.Text += "Start" + Environment.NewLine;
        }

        private void watcher_Created(object sender , FileSystemEventArgs e)
        {
            tbMessage.Text += "Created" + e.Name + Environment.NewLine;
        }
        private void watcher_Changed(object sender, FileSystemEventArgs e)
        {
            tbMessage.Text += "Changed" + e.Name + Environment.NewLine;
        }
        private void watcher_Error(object sender, ErrorEventArgs e)
        {
            tbMessage.Text += "Error" + e.GetException().Message + Environment.NewLine;
        }

        private void watcher_Deleted(object sender, FileSystemEventArgs e)
        {
            tbMessage.Text += "Deleted" + e.Name + Environment.NewLine;
        }

        private void watcher_Renamed(object sender, RenamedEventArgs e)
        {
            tbMessage.Text += "Renamed" + e.Name + Environment.NewLine;
        }
    }
}
~~~
</details>

# 参考ページ

https://learn.microsoft.com/ja-jp/dotnet/api/system.io.filesystemwatcher?view=net-8.0