FileSystemWatcher

[C#] FileSystemWatcherでフォルダを除外する方法

C#のFileSystemWatcherクラスは、ファイルシステムの変更を監視するためのツールですが、特定のフォルダを直接除外する機能はありません。

フォルダを除外するには、監視対象のイベントが発生した際に、そのイベントが除外したいフォルダに関連するかどうかを確認し、関連する場合は処理をスキップする方法が一般的です。

具体的には、FileSystemWatcherのイベントハンドラ内で、イベントのパスをチェックし、除外したいフォルダのパスと一致するかどうかを条件分岐で確認します。

これにより、特定のフォルダに対する変更を無視することができます。

フォルダを除外する方法

イベントハンドラでのパスチェック

FileSystemWatcherを使用してフォルダの変更を監視する際、特定のフォルダを除外するためには、イベントハンドラ内でパスをチェックする必要があります。

以下のサンプルコードでは、Changedイベントが発生した際に、変更されたファイルのパスを確認しています。

using System;
using System.IO;
using System.Windows.Forms;
public partial class MyForm : Form
{
    private FileSystemWatcher watcher;
    private string[] excludedFolders = { @"C:\ExcludedFolder1", @"C:\ExcludedFolder2" };
    public MyForm()
    {
        InitializeComponent();
        InitializeFileSystemWatcher();
    }
    private void InitializeFileSystemWatcher()
    {
        watcher = new FileSystemWatcher();
        watcher.Path = @"C:\WatchedFolder";
        watcher.Changed += OnChanged;
        watcher.EnableRaisingEvents = true;
    }
    private void OnChanged(object sender, FileSystemEventArgs e)
    {
        // 除外フォルダのパスをチェック
        if (IsExcludedFolder(e.FullPath))
        {
            return; // 除外フォルダの場合は処理を中止
        }
        // 変更があった場合の処理
        MessageBox.Show($"変更がありました: {e.FullPath}");
    }
    private bool IsExcludedFolder(string path)
    {
        foreach (var folder in excludedFolders)
        {
            if (path.StartsWith(folder, StringComparison.OrdinalIgnoreCase))
            {
                return true; // 除外フォルダに一致
            }
        }
        return false; // 除外フォルダではない
    }
}

このコードでは、OnChangedメソッド内でIsExcludedFolderメソッドを呼び出し、変更されたファイルのパスが除外フォルダに含まれているかを確認しています。

除外フォルダのパスをリスト化する

除外するフォルダのパスは、配列やリストとして管理することができます。

上記のサンプルコードでは、excludedFoldersという配列を使用して、除外するフォルダのパスをリスト化しています。

これにより、簡単に除外フォルダを追加・削除することが可能です。

除外フォルダのパス説明
C:\ExcludedFolder1除外するフォルダ1
C:\ExcludedFolder2除外するフォルダ2

このように、除外フォルダのパスをリスト化することで、管理が容易になります。

条件分岐による除外処理の実装

条件分岐を使用して、特定の条件に基づいてフォルダを除外する処理を実装します。

上記のIsExcludedFolderメソッドでは、foreachループを使用して、変更されたファイルのパスが除外フォルダのいずれかに一致するかを確認しています。

この方法により、複数の除外フォルダを簡単に管理でき、必要に応じて条件を追加することも可能です。

例えば、特定のファイル拡張子を持つファイルを除外する場合は、条件を追加することで対応できます。

private bool IsExcludedFile(string path)
{
    string[] excludedExtensions = { ".tmp", ".log" };
    string extension = Path.GetExtension(path);
    return excludedExtensions.Contains(extension); // 除外拡張子に一致するか
}

このように、条件分岐を活用することで、柔軟な除外処理を実装することができます。

応用例

複数フォルダの除外

複数のフォルダを除外する場合、excludedFolders配列に必要なパスを追加することで対応できます。

以下のサンプルコードでは、複数のフォルダを除外する方法を示しています。

using System;
using System.IO;
using System.Windows.Forms;
public partial class MyForm : Form
{
    private FileSystemWatcher watcher;
    private string[] excludedFolders = { @"C:\ExcludedFolder1", @"C:\ExcludedFolder2", @"C:\ExcludedFolder3" };
    public MyForm()
    {
        InitializeComponent();
        InitializeFileSystemWatcher();
    }
    private void InitializeFileSystemWatcher()
    {
        watcher = new FileSystemWatcher();
        watcher.Path = @"C:\WatchedFolder";
        watcher.Changed += OnChanged;
        watcher.EnableRaisingEvents = true;
    }
    private void OnChanged(object sender, FileSystemEventArgs e)
    {
        if (IsExcludedFolder(e.FullPath))
        {
            return; // 除外フォルダの場合は処理を中止
        }
        MessageBox.Show($"変更がありました: {e.FullPath}");
    }
    private bool IsExcludedFolder(string path)
    {
        foreach (var folder in excludedFolders)
        {
            if (path.StartsWith(folder, StringComparison.OrdinalIgnoreCase))
            {
                return true; // 除外フォルダに一致
            }
        }
        return false; // 除外フォルダではない
    }
}

このコードでは、excludedFoldersに複数のフォルダを指定することで、変更を監視する際にそれらのフォルダを除外しています。

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

特定のファイルタイプのみを監視する場合、FileSystemWatcherFilterプロパティを使用します。

以下のサンプルコードでは、.txtファイルのみを監視する方法を示しています。

private void InitializeFileSystemWatcher()
{
    watcher = new FileSystemWatcher();
    watcher.Path = @"C:\WatchedFolder";
    watcher.Filter = "*.txt"; // .txtファイルのみを監視
    watcher.Changed += OnChanged;
    watcher.EnableRaisingEvents = true;
}

このように、Filterプロパティを設定することで、特定のファイルタイプに絞って監視を行うことができます。

これにより、不要なファイルの変更イベントを無視することが可能です。

除外フォルダの動的更新

除外フォルダのリストを動的に更新することも可能です。

例えば、ユーザーがフォーム上で除外フォルダを追加・削除できるようにする場合、以下のような実装が考えられます。

private void AddExcludedFolder(string folderPath)
{
    Array.Resize(ref excludedFolders, excludedFolders.Length + 1);
    excludedFolders[excludedFolders.Length - 1] = folderPath; // 新しいフォルダを追加
}
private void RemoveExcludedFolder(string folderPath)
{
    excludedFolders = excludedFolders.Where(f => f != folderPath).ToArray(); // 指定したフォルダを削除
}

このコードでは、AddExcludedFolderメソッドで新しいフォルダを追加し、RemoveExcludedFolderメソッドで指定したフォルダを削除しています。

これにより、ユーザーが必要に応じて除外フォルダを管理できるようになります。

まとめ

この記事では、C#のFileSystemWatcherを使用して特定のフォルダを除外する方法について詳しく解説しました。

フォルダの除外処理を実装することで、監視対象を効率的に管理し、不要なイベントを回避することが可能です。

今後は、実際のプロジェクトにおいて、除外フォルダの管理や特定のファイルタイプの監視を行う際に、この記事で紹介したテクニックを活用してみてください。

Back to top button