[C#] ファイル監視とリアルタイム処理

スポンサーリンク

はじめに

C#では、特定のディレクトリ内でファイルの変更や作成、削除をリアルタイムで監視し、即座に処理を行うことができます。FileSystemWatcherクラスを使用すると、ファイルの監視を効率的に行うことができ、ログ記録、ファイルバックアップ、自動処理など、さまざまな用途に役立ちます。本記事では、C#を使ったファイル監視とリアルタイム処理について詳しく解説します。

 

FileSystemWatcherクラスの概要

FileSystemWatcherクラスは、指定したディレクトリ内でファイルやフォルダの変更を監視するために使用されます。以下の操作を監視することが可能です。

  • ファイルやディレクトリの作成(Create)
  • ファイルやディレクトリの変更(Change)
  • ファイルやディレクトリの削除(Delete)
  • ファイルやディレクトリのリネーム(Rename)

これにより、リアルタイムでファイルシステムの状態を把握し、必要な処理を自動的に実行することができます。

 

FileSystemWatcherの基本的な使い方

FileSystemWatcherを使ってファイル監視を行うには、まずインスタンスを作成し、監視対象ディレクトリやイベントを設定します。

ファイル監視の基本的なコード例

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string directoryToWatch = @"C:\example\watchfolder";

        // FileSystemWatcherのインスタンスを作成
        FileSystemWatcher watcher = new FileSystemWatcher();
        
        // 監視対象のディレクトリを指定
        watcher.Path = directoryToWatch;
        
        // 監視するイベントを設定
        watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite | NotifyFilters.CreationTime;
        
        // 全てのファイルを監視
        watcher.Filter = "*.*";
        
        // イベントハンドラを登録
        watcher.Created += OnCreated;
        watcher.Changed += OnChanged;
        watcher.Deleted += OnDeleted;
        watcher.Renamed += OnRenamed;
        
        // 監視を開始
        watcher.EnableRaisingEvents = true;

        Console.WriteLine($"ディレクトリ '{directoryToWatch}' の監視を開始しました...");
        Console.WriteLine("Enterキーを押すと終了します。");
        Console.ReadLine();
    }

    // ファイル作成時の処理
    private static void OnCreated(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine($"ファイル作成: {e.FullPath}");
    }

    // ファイル変更時の処理
    private static void OnChanged(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine($"ファイル変更: {e.FullPath}");
    }

    // ファイル削除時の処理
    private static void OnDeleted(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine($"ファイル削除: {e.FullPath}");
    }

    // ファイルリネーム時の処理
    private static void OnRenamed(object sender, RenamedEventArgs e)
    {
        Console.WriteLine($"ファイルリネーム: {e.OldFullPath} から {e.FullPath}");
    }
}

解説:

  • Path: 監視対象のディレクトリを設定します。
  • NotifyFilter: 監視するイベントの種類(ファイル名の変更、更新、作成など)を指定します。
  • Filter: 監視するファイルの種類を指定します。"*.*"はすべてのファイルを対象とします。
  • イベントハンドラ: ファイルの作成、変更、削除、リネームが発生した際に実行されるメソッドを設定します。

 

FileSystemWatcherでの詳細な設定

サブディレクトリの監視

デフォルトでは、FileSystemWatcherは指定したディレクトリ内の変更のみを監視しますが、サブディレクトリ内も監視するように設定できます。

watcher.IncludeSubdirectories = true;

特定のファイル形式のみを監視

監視するファイルの種類を制限したい場合、Filterプロパティを使います。

// テキストファイルのみを監視
watcher.Filter = "*.txt";

これにより、.txtファイルだけが監視対象になります。

バッファサイズの調整

FileSystemWatcherは変更イベントをバッファに保存しますが、バッファサイズが足りない場合はイベントが失われる可能性があります。バッファサイズを調整することで、イベントの損失を防げます。

watcher.InternalBufferSize = 65536; // 64KB

バッファサイズを大きくするとメモリの使用量も増加するため、適切なサイズに調整することが重要です。

 

エラーハンドリングと例外処理

FileSystemWatcherを使用する際には、エラーハンドリングが重要です。特に、アクセス権限の問題や大量のイベント処理に伴うエラーが発生する可能性があります。

エラーイベントのハンドリング

FileSystemWatcherはエラーイベントを発生させることがあり、これをキャッチして処理することができます。

watcher.Error += OnError;

private static void OnError(object sender, ErrorEventArgs e)
{
    Console.WriteLine($"エラーが発生しました: {e.GetException().Message}");
}

この方法で、ファイル監視中に発生する例外をキャッチし、エラーログを記録するなどの対応が可能です。

デバウンス処理

ファイルの変更イベントは、複数回連続して発生することがあります。デバウンス処理を取り入れることで、短期間に何度も同じファイルのイベントが発生するのを防ぎます。

private static DateTime lastReadTime = DateTime.MinValue;

private static void OnChanged(object sender, FileSystemEventArgs e)
{
    DateTime currentReadTime = DateTime.Now;

    // 500ミリ秒以内に再度呼ばれた場合は無視
    if ((currentReadTime - lastReadTime).TotalMilliseconds < 500)
    {
        return;
    }

    lastReadTime = currentReadTime;

    Console.WriteLine($"ファイル変更: {e.FullPath}");
}

この処理により、連続するイベントが発生しても一度だけ処理を行うようにできます。

デバウンス処理(debouncing)とは、特定のイベントが発生した際に、そのイベントが連続して短時間に発生するのを防ぎ、一定の時間が経過した後にのみ処理を実行する技術です。この技術は、イベントが頻繁に発生する場合に、無駄な処理を避けるために非常に便利です。

 

リアルタイム処理の応用例

ファイル監視とリアルタイム処理を組み合わせることで、さまざまな応用が可能です。以下はいくつかの実用的な例です。

ログファイルのリアルタイム監視

システムやアプリケーションのログファイルをリアルタイムで監視し、特定のエラーメッセージが出現した際に通知を行うシステムを作成できます。

if (e.FullPath.EndsWith(".log"))
{
    string content = File.ReadAllText(e.FullPath);
    if (content.Contains("ERROR"))
    {
        Console.WriteLine("エラーメッセージが検出されました。");
        // ここでメール通知などを行う
    }
}

自動バックアップシステム

特定のディレクトリでファイルが変更された際に、自動でバックアップを作成する仕組みを作ることも可能です。

string backupDirectory = @"C:\backup";

private static void OnCreated(object sender, FileSystemEventArgs e)
{
    string backupPath = Path.Combine(backupDirectory, Path.GetFileName(e.FullPath));
    File.Copy(e.FullPath, backupPath);
    Console.WriteLine($"ファイルがバックアップされました: {backupPath}");
}

 

まとめ

C#のFileSystemWatcherを使用すると、ファイルやディレクトリの変更をリアルタイムで監視し、さまざまな自動処理を実装できます。ログ監視、バックアップ、通知システムなど、多くの応用が可能であり、効率的なシステム開発に役立ちます。エラーハンドリングやパフォーマンスの最適化も重要な要素なので、適切に処理することが推奨されます。

Please follow and like us:

コメント

タイトルとURLをコピーしました