[C#] FileSystemWatcherでサブディレクトリを監視する方法
FileSystemWatcherでサブディレクトリを監視するには、まずFileSystemWatcherオブジェクトを作成し、監視したいディレクトリのパスを指定します。
次に、IncludeSubdirectoriesプロパティをtrueに設定することで、指定したディレクトリのサブディレクトリも含めて監視できます。
さらに、Changed、Created、Deleted、Renamedなどのイベントハンドラを設定して、ファイルやディレクトリの変更を検知します。
最後に、EnableRaisingEventsプロパティをtrueにして監視を開始します。
これにより、指定したディレクトリとそのサブディレクトリ内でのファイルシステムの変更をリアルタイムで監視できます。
サブディレクトリの監視設定
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}");
}
}このコードでは、EnableRaisingEventsをtrueに設定することで、指定したディレクトリ内のファイル変更を監視する準備が整います。
これにより、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}");
}
}このコードでは、watcher1とwatcher2の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ファイルに追記しています。
これにより、監視イベントの履歴を残すことができます。
まとめ
この記事では、C#のFileSystemWatcherを使用してサブディレクトリを監視する方法について詳しく解説しました。
具体的には、イベントハンドラの設定や監視対象のディレクトリの指定、特定のファイルタイプの監視、複数のディレクトリの同時監視、監視イベントのログ記録など、実用的な応用例を紹介しました。
これらの知識を活用することで、ファイルシステムの変更をリアルタイムで把握し、効率的なデータ管理が可能になります。
ぜひ、実際のプロジェクトにFileSystemWatcherを取り入れて、ファイル監視の自動化を試みてください。