【C#.NET解説】フォルダー内の変更を見逃さない!「FileSystemWatcher」クラスでファイル変化を簡単監視

2024年11月10日日曜日

パス・ディレクトリ ファイル操作

t f B! P L
名前空間 System.IO
FileSystemWatcher

自己紹介

やあ、謎多き神「FileSystemWatcher」だ。今日は私が「C#.NET」のFileSystemWatcherクラスについて語る。影から監視する私の能力と似ているこのクラスの機能を、一緒に探求しよう。

基本機能

FileSystemWatcherクラスは、指定したフォルダやファイルの変化を監視し、変更を検知するためのクラスだ。このクラスを使えば、ファイルの作成、変更、削除などのイベントをリアルタイムで処理することが可能だ。

C#

// FileSystemWatcherの基本機能
using System;
using System.IO;

class Program
{
    static void Main()
    {
        FileSystemWatcher watcher = new FileSystemWatcher(@"C:\Temp");

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

        // イベントハンドラーの設定
        watcher.Changed += OnChanged;
        watcher.Created += OnChanged;

        // 監視を開始
        watcher.EnableRaisingEvents = true;

        Console.WriteLine("ファイル監視を開始しました。Enterを押すと終了します。");
        Console.ReadLine();
    }

    private static void OnChanged(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine($"ファイルが変更されました: {e.FullPath} - {e.ChangeType}");
    }
}

ネットワーク上での注意点

ネットワーク共有ディレクトリを監視する際、FileSystemWatcherのパフォーマンスが低下する場合がある。特に、通知が遅延したり、バッファーがオーバーフローする可能性がある点に注意しよう。

C#

// ネットワークディレクトリの監視
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string networkPath = @"\\NetworkShare\Temp";

        if (!Directory.Exists(networkPath))
        {
            Console.WriteLine("ネットワークパスが無効です。");
            return;
        }

        FileSystemWatcher watcher = new FileSystemWatcher(networkPath);
        watcher.EnableRaisingEvents = true;

        Console.WriteLine("ネットワークディレクトリを監視中...");
        Console.ReadLine();
    }
}

BufferSizeを最適化する方法

FileSystemWatcherの内部バッファーサイズはデフォルトで8192バイトだが、大量のイベントが発生するとオーバーフローする場合がある。この問題を回避するため、バッファーサイズを調整することができる。ただし、最大で64KBまでしか設定できない。

各イベントは最大16バイトのメモリーを使用するため、イベントが多すぎると最悪検知出来ないということもある。

C#

// BufferSizeの設定
FileSystemWatcher watcher = new FileSystemWatcher(@"C:\Temp");
watcher.InternalBufferSize = 64 * 1024; // 64KBに設定

その他のプロパティの説明

FileSystemWatcherには以下の便利なプロパティがある。

  • IncludeSubdirectories: サブディレクトリも監視するかどうかを指定する。
  • Filter: 監視対象のファイルタイプを指定する。

これらを使うことで、より詳細な監視が可能になる。

C#

// IncludeSubdirectoriesとFilterの使用例
FileSystemWatcher watcher = new FileSystemWatcher(@"C:\Temp");
watcher.IncludeSubdirectories = true; // サブディレクトリを監視
watcher.Filter = "*.txt"; // テキストファイルのみ監視

解説

FileSystemWatcherは、ファイルやフォルダの変化を即座に検知する強力なツールだ。しかし、ネットワーク環境やバッファサイズの設定など、注意すべき点も多い。このクラスを使いこなすことで、システムの自動化や効率化を図ることができるだろう。では、次の冒険でまた会おう!

このブログを検索

QooQ