[C#] FileSystemWatcherでサブディレクトリを監視する方法

FileSystemWatcherでサブディレクトリを監視するには、まずFileSystemWatcherオブジェクトを作成し、監視したいディレクトリのパスを指定します。

次に、IncludeSubdirectoriesプロパティをtrueに設定することで、指定したディレクトリのサブディレクトリも含めて監視できます。

さらに、ChangedCreatedDeletedRenamedなどのイベントハンドラを設定して、ファイルやディレクトリの変更を検知します。

最後に、EnableRaisingEventsプロパティをtrueにして監視を開始します。

これにより、指定したディレクトリとそのサブディレクトリ内でのファイルシステムの変更をリアルタイムで監視できます。

この記事でわかること
  • FileSystemWatcherの基本的な使い方
  • サブディレクトリの監視設定方法
  • 監視イベントの種類と設定方法
  • 特定のファイルタイプの監視方法
  • 監視イベントのログ記録方法

目次から探す

サブディレクトリの監視設定

IncludeSubdirectoriesプロパティの設定

FileSystemWatcherクラスを使用してサブディレクトリを監視するには、IncludeSubdirectoriesプロパティをtrueに設定する必要があります。

このプロパティを設定することで、指定したディレクトリ内のすべてのサブディレクトリも監視対象となります。

以下はその設定方法のサンプルコードです。

partial class MyForm : Form
{
    private FileSystemWatcher watcher;
    public MyForm()
    {
        InitializeComponent(); // フォームの初期化
        watcher = new FileSystemWatcher();
        watcher.Path = @"C:\監視するディレクトリ"; // 監視するディレクトリのパスを指定
        watcher.IncludeSubdirectories = true; // サブディレクトリも監視する設定
    }
}

この設定を行うことで、指定したディレクトリ内のすべてのサブディレクトリで発生するファイルの変更を監視することができます。

サブディレクトリを監視するメリット

スクロールできます
メリット説明
変更の即時検知サブディレクトリ内のファイル変更を即座に検知できる。
管理の効率化複数のディレクトリを一括で監視でき、管理が容易。
自動化の促進自動処理やバックアップなどのタスクを簡単に実行可能。

サブディレクトリを監視することで、ファイルの変更をリアルタイムで把握できるため、特に大規模なプロジェクトやデータ管理において非常に便利です。

サブディレクトリ監視の注意点

  • パフォーマンスの影響: 多数のサブディレクトリを監視すると、システムリソースを消費する可能性があるため、必要な範囲に絞ることが重要です。
  • イベントの重複: 同時に複数の変更が発生した場合、イベントが重複して発生することがあります。

これに対処するためのロジックが必要です。

  • アクセス権限: サブディレクトリに対するアクセス権限が不足していると、監視が正常に行えない場合があります。

適切な権限を設定することが求められます。

これらの注意点を考慮しながら、サブディレクトリの監視を行うことが重要です。

イベントハンドラの設定

Changedイベントの設定

Changedイベントは、監視対象のファイルやディレクトリが変更されたときに発生します。

このイベントを設定することで、ファイルの内容が変更された際に特定の処理を実行できます。

以下は、Changedイベントの設定方法のサンプルコードです。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent(); // フォームの初期化
        watcher = new FileSystemWatcher();
        watcher.Path = @"C:\監視するディレクトリ"; // 監視するディレクトリのパスを指定
        watcher.IncludeSubdirectories = true; // サブディレクトリも監視する設定
        watcher.Changed += OnChanged; // Changedイベントのハンドラを登録
    }
    private void OnChanged(object sender, FileSystemEventArgs e)
    {
        // 変更があったファイルの情報を表示
        MessageBox.Show($"変更がありました: {e.FullPath}");
    }
}

このコードでは、ファイルが変更されると、変更されたファイルのパスを表示するメッセージボックスが表示されます。

Createdイベントの設定

Createdイベントは、新しいファイルやディレクトリが作成されたときに発生します。

このイベントを利用することで、新規作成されたファイルに対して特定の処理を行うことができます。

以下は、Createdイベントの設定方法のサンプルコードです。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent(); // フォームの初期化
        watcher = new FileSystemWatcher();
        watcher.Path = @"C:\監視するディレクトリ"; // 監視するディレクトリのパスを指定
        watcher.IncludeSubdirectories = true; // サブディレクトリも監視する設定
        watcher.Created += OnCreated; // Createdイベントのハンドラを登録
    }
    private void OnCreated(object sender, FileSystemEventArgs e)
    {
        // 新規作成されたファイルの情報を表示
        MessageBox.Show($"新しいファイルが作成されました: {e.FullPath}");
    }
}

このコードでは、新しいファイルが作成されると、そのファイルのパスを表示するメッセージボックスが表示されます。

Deletedイベントの設定

Deletedイベントは、監視対象のファイルやディレクトリが削除されたときに発生します。

このイベントを設定することで、削除されたファイルに対して特定の処理を実行できます。

以下は、Deletedイベントの設定方法のサンプルコードです。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent(); // フォームの初期化
        watcher = new FileSystemWatcher();
        watcher.Path = @"C:\監視するディレクトリ"; // 監視するディレクトリのパスを指定
        watcher.IncludeSubdirectories = true; // サブディレクトリも監視する設定
        watcher.Deleted += OnDeleted; // Deletedイベントのハンドラを登録
    }
    private void OnDeleted(object sender, FileSystemEventArgs e)
    {
        // 削除されたファイルの情報を表示
        MessageBox.Show($"ファイルが削除されました: {e.FullPath}");
    }
}

このコードでは、ファイルが削除されると、そのファイルのパスを表示するメッセージボックスが表示されます。

Renamedイベントの設定

Renamedイベントは、監視対象のファイルやディレクトリが名前を変更されたときに発生します。

このイベントを設定することで、ファイル名の変更に対して特定の処理を実行できます。

以下は、Renamedイベントの設定方法のサンプルコードです。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent(); // フォームの初期化
        watcher = new FileSystemWatcher();
        watcher.Path = @"C:\監視するディレクトリ"; // 監視するディレクトリのパスを指定
        watcher.IncludeSubdirectories = true; // サブディレクトリも監視する設定
        watcher.Renamed += OnRenamed; // Renamedイベントのハンドラを登録
    }
    private void OnRenamed(object sender, RenamedEventArgs e)
    {
        // 名前が変更されたファイルの情報を表示
        MessageBox.Show($"ファイル名が変更されました: {e.OldFullPath} -> {e.FullPath}");
    }
}

このコードでは、ファイル名が変更されると、変更前と変更後のファイルのパスを表示するメッセージボックスが表示されます。

FileSystemWatcherの実装手順

FileSystemWatcherオブジェクトの作成

FileSystemWatcherを使用するには、まずそのオブジェクトを作成する必要があります。

以下のサンプルコードでは、FileSystemWatcherオブジェクトを作成する方法を示しています。

partial class MyForm : Form
{
    private FileSystemWatcher watcher; // FileSystemWatcherオブジェクトの宣言
    public MyForm()
    {
        InitializeComponent(); // フォームの初期化
        watcher = new FileSystemWatcher(); // FileSystemWatcherオブジェクトの作成
    }
}

このコードでは、watcherという名前のFileSystemWatcherオブジェクトを宣言し、コンストラクタ内でインスタンスを作成しています。

監視するディレクトリの指定

次に、監視するディレクトリのパスを指定します。

Pathプロパティを使用して、監視対象のディレクトリを設定します。

以下はその設定方法のサンプルコードです。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent(); // フォームの初期化
        watcher = new FileSystemWatcher(); // FileSystemWatcherオブジェクトの作成
        watcher.Path = @"C:\監視するディレクトリ"; // 監視するディレクトリのパスを指定
    }
}

このコードでは、watcher.Pathに監視したいディレクトリのパスを設定しています。

イベントハンドラの登録

次に、監視対象のイベントに対するハンドラを登録します。

これにより、特定のファイル操作が行われた際に、指定した処理を実行することができます。

以下は、Changedイベントのハンドラを登録するサンプルコードです。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent(); // フォームの初期化
        watcher = new FileSystemWatcher(); // FileSystemWatcherオブジェクトの作成
        watcher.Path = @"C:\監視するディレクトリ"; // 監視するディレクトリのパスを指定
        watcher.Changed += OnChanged; // Changedイベントのハンドラを登録
    }
    private void OnChanged(object sender, FileSystemEventArgs e)
    {
        // 変更があったファイルの情報を表示
        MessageBox.Show($"変更がありました: {e.FullPath}");
    }
}

このコードでは、Changedイベントに対してOnChangedメソッドをハンドラとして登録しています。

EnableRaisingEventsプロパティの設定

最後に、EnableRaisingEventsプロパティをtrueに設定することで、監視を開始します。

このプロパティを設定しないと、イベントは発生しません。

以下はその設定方法のサンプルコードです。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent(); // フォームの初期化
        watcher = new FileSystemWatcher(); // FileSystemWatcherオブジェクトの作成
        watcher.Path = @"C:\監視するディレクトリ"; // 監視するディレクトリのパスを指定
        watcher.Changed += OnChanged; // Changedイベントのハンドラを登録
        watcher.EnableRaisingEvents = true; // 監視を開始
    }
    private void OnChanged(object sender, FileSystemEventArgs e)
    {
        // 変更があったファイルの情報を表示
        MessageBox.Show($"変更がありました: {e.FullPath}");
    }
}

このコードでは、EnableRaisingEventstrueに設定することで、指定したディレクトリ内のファイル変更を監視する準備が整います。

これにより、Changedイベントが発生するようになります。

応用例

特定のファイルタイプのみを監視する

FileSystemWatcherを使用して特定のファイルタイプのみを監視するには、Filterプロパティを設定します。

このプロパティに監視したいファイルの拡張子を指定することで、特定のファイルタイプに対するイベントのみを受け取ることができます。

以下は、.txtファイルのみを監視するサンプルコードです。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent(); // フォームの初期化
        watcher = new FileSystemWatcher(); // FileSystemWatcherオブジェクトの作成
        watcher.Path = @"C:\監視するディレクトリ"; // 監視するディレクトリのパスを指定
        watcher.Filter = "*.txt"; // .txtファイルのみを監視
        watcher.Changed += OnChanged; // Changedイベントのハンドラを登録
        watcher.EnableRaisingEvents = true; // 監視を開始
    }
    private void OnChanged(object sender, FileSystemEventArgs e)
    {
        // 変更があったファイルの情報を表示
        MessageBox.Show($"変更がありました: {e.FullPath}");
    }
}

このコードでは、Filterプロパティに"*.txt"を設定することで、.txtファイルの変更のみを監視しています。

複数のディレクトリを同時に監視する

FileSystemWatcherは1つのディレクトリしか監視できませんが、複数のFileSystemWatcherオブジェクトを作成することで、複数のディレクトリを同時に監視することができます。

以下は、2つのディレクトリを監視するサンプルコードです。

partial class MyForm : Form
{
    private FileSystemWatcher watcher1;
    private FileSystemWatcher watcher2;
    public MyForm()
    {
        InitializeComponent(); // フォームの初期化
        watcher1 = new FileSystemWatcher(); // 1つ目のFileSystemWatcherオブジェクトの作成
        watcher1.Path = @"C:\監視するディレクトリ1"; // 監視するディレクトリのパスを指定
        watcher1.EnableRaisingEvents = true; // 監視を開始
        watcher1.Changed += OnChanged; // Changedイベントのハンドラを登録
        watcher2 = new FileSystemWatcher(); // 2つ目のFileSystemWatcherオブジェクトの作成
        watcher2.Path = @"C:\監視するディレクトリ2"; // 監視するディレクトリのパスを指定
        watcher2.EnableRaisingEvents = true; // 監視を開始
        watcher2.Changed += OnChanged; // Changedイベントのハンドラを登録
    }
    private void OnChanged(object sender, FileSystemEventArgs e)
    {
        // 変更があったファイルの情報を表示
        MessageBox.Show($"変更がありました: {e.FullPath}");
    }
}

このコードでは、watcher1watcher2の2つのFileSystemWatcherオブジェクトを作成し、それぞれ異なるディレクトリを監視しています。

監視イベントのログを記録する

監視イベントが発生した際に、その情報をログとして記録することも可能です。

これには、ファイルに書き込む処理を追加します。

以下は、監視イベントの情報をlog.txtファイルに記録するサンプルコードです。

partial class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent(); // フォームの初期化
        watcher = new FileSystemWatcher(); // FileSystemWatcherオブジェクトの作成
        watcher.Path = @"C:\監視するディレクトリ"; // 監視するディレクトリのパスを指定
        watcher.EnableRaisingEvents = true; // 監視を開始
        watcher.Changed += OnChanged; // Changedイベントのハンドラを登録
    }
    private void OnChanged(object sender, FileSystemEventArgs e)
    {
        // 変更があったファイルの情報をログファイルに記録
        string logMessage = $"{DateTime.Now}: 変更がありました: {e.FullPath}";
        File.AppendAllText(@"C:\監視するディレクトリ\log.txt", logMessage + Environment.NewLine);
    }
}

このコードでは、OnChangedメソッド内で、変更があったファイルの情報をlog.txtファイルに追記しています。

これにより、監視イベントの履歴を残すことができます。

よくある質問

FileSystemWatcherで監視できるファイル数に制限はある?

FileSystemWatcher自体には、監視できるファイル数に明確な制限はありませんが、実際にはシステムリソースやパフォーマンスに依存します。

特に、監視するディレクトリ内に大量のファイルやサブディレクトリが存在する場合、リソースの消費が増加し、パフォーマンスが低下する可能性があります。

したがって、必要な範囲に絞って監視を行うことが推奨されます。

FileSystemWatcherが変更を見逃すことはある?

はい、FileSystemWatcherは変更を見逃すことがあります。

特に、以下のような状況で見逃す可能性があります。

  • 高頻度の変更: 短時間に多数の変更が発生した場合、イベントが重複して発生し、いくつかの変更が見逃されることがあります。
  • システムリソースの制約: システムのリソースが不足している場合、イベントが正しく処理されないことがあります。
  • ファイルシステムの制限: 一部のファイルシステムでは、特定の操作に対してイベントが発生しないことがあります。

これらの理由から、重要なファイル操作に対しては、別の手段で確認することが望ましいです。

サブディレクトリの監視を停止するにはどうすればいい?

サブディレクトリの監視を停止するには、FileSystemWatcherオブジェクトのEnableRaisingEventsプロパティをfalseに設定します。

これにより、監視が停止します。

以下はその方法の例です。

watcher.EnableRaisingEvents = false; // 監視を停止

また、特定のサブディレクトリの監視を停止したい場合は、FileSystemWatcherオブジェクトを新たに作成し、監視対象のパスを変更することもできます。

これにより、必要なディレクトリのみを監視することが可能です。

まとめ

この記事では、C#のFileSystemWatcherを使用してサブディレクトリを監視する方法について詳しく解説しました。

具体的には、イベントハンドラの設定や監視対象のディレクトリの指定、特定のファイルタイプの監視、複数のディレクトリの同時監視、監視イベントのログ記録など、実用的な応用例を紹介しました。

これらの知識を活用することで、ファイルシステムの変更をリアルタイムで把握し、効率的なデータ管理が可能になります。

ぜひ、実際のプロジェクトにFileSystemWatcherを取り入れて、ファイル監視の自動化を試みてください。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す