C#でFileSystemWatcherを操作する方法

System.IO名前空間のFileSystemWatcherクラスを使用して、ファイルシステムへの変更を監視できます。システム内のファイルまたはディレクトリの変更を監視し、変更が発生するとイベントをトリガーします。

FileSystemWatcherが機能するためには、監視する必要のあるディレクトリを指定する必要があります。FileSystemWatcherは、監視しているディレクトリに変更が発生すると、次のイベントを発生させます。

  • 変更:このイベントは、監視対象のパス内のファイルまたはディレクトリが変更されたときにトリガーされます
  • 作成済み:このイベントは、監視対象のパスにファイルまたはディレクトリが作成されたときにトリガーされます
  • 削除済み:このイベントは、監視対象のパス内のファイルまたはディレクトリが削除されたときにトリガーされます
  • エラー:このイベントがトリガーされ、監視対象のパスに変更が加えられたためにエラーが発生しました
  • 名前の変更:このイベントは、監視対象のパス内のファイルまたはディレクトリの名前が変更されたときにトリガーされます

C#で簡単なファイルシステムウォッチャーを作成する

Visual Studioで新しいコンソールアプリケーションプロジェクトを作成して、一般的なファイルシステムウォッチャーがどのように機能するかを示しましょう。FileSystemWatcherクラスを使用するより良い方法は、Windowsサービスを使用することであることに注意してください。FileSystemWatcherクラスを使用し、監視対象のパスに変更が発生したときに通知を送信するWindowsサービスを構築できます。

とにかく、今度は少しコードを始めましょう。Program.csファイルのMainメソッドに、次のコードを記述します。

static void Main(string[] args)

        {

            string path = @"D:\";

            MonitorDirectory(path);

            Console.ReadKey();

        }

次のコードスニペットは、MonitorDirectoryメソッドがどのように見えるかを示しています。このメソッドは、特定のディレクトリを監視し、変更が発生するたびにイベントを発生させるために使用されます。ディレクトリパスは、引数としてメソッドに渡されます。

private static void MonitorDirectory(string path)

        {

            FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();

            fileSystemWatcher.Path = path;

            fileSystemWatcher.Created += FileSystemWatcher_Created;

            fileSystemWatcher.Renamed += FileSystemWatcher_Renamed;

            fileSystemWatcher.Deleted += FileSystemWatcher_Deleted;

            fileSystemWatcher.EnableRaisingEvents = true;

        }

イベントがどのように宣言されているか、およびファイルシステムウォッチャーオブジェクトのEnableRaisingEventsプロパティがtrueに設定されていることに注意してください。これにより、監視対象のパスに変更が発生したときにイベントを発生させることができます。本質的に、これにより実際の監視が開始されます。つまり、パスの監視を開始し、今後適切なイベントを発生させるようにFileSystemWatcherに通知します。

宣言したイベントごとに、イベントがトリガーされたときに実行されるそれぞれのイベントハンドラーが必要です。監視対象のディレクトリへの変更が発生したときにトリガーされるイベントハンドラのソースコードは次のとおりです。

 private static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)

        {

            Console.WriteLine("File created: {0}", e.Name);

        }

        private static void FileSystemWatcher_Renamed(object sender, FileSystemEventArgs e)

        {

            Console.WriteLine("File renamed: {0}", e.Name);

        }

        private static void FileSystemWatcher_Deleted(object sender, FileSystemEventArgs e)

        {

            Console.WriteLine("File deleted: {0}", e.Name);

        }

参考までに、完全なソースコードを次に示します。

using System;

using System.IO;

namespace FileSystemWatcher

{

    class Program

    {

        static void Main(string[] args)

        {

            string path = @"D:\";

            MonitorDirectory(path);

            Console.ReadKey();

        }

        private static void MonitorDirectory(string path)

        {

            FileSystemWatcher fileSystemWatcher = new FileSystemWatcher();

            fileSystemWatcher.Path = path;

            fileSystemWatcher.Created += FileSystemWatcher_Created;

            fileSystemWatcher.Renamed += FileSystemWatcher_Renamed;

            fileSystemWatcher.Deleted += FileSystemWatcher_Deleted;

            fileSystemWatcher.EnableRaisingEvents = true;

        }

        private static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)

        {

            Console.WriteLine("File created: {0}", e.Name);

        }

        private static void FileSystemWatcher_Renamed(object sender, FileSystemEventArgs e)

        {

            Console.WriteLine("File renamed: {0}", e.Name);

        }

        private static void FileSystemWatcher_Deleted(object sender, FileSystemEventArgs e)

        {

            Console.WriteLine("File deleted: {0}", e.Name);

        }

    }

}

指定されたディレクトリがシステムのD:\>ドライブで使用可能であると想定して、コンソールアプリケーションを実行し、ディレクトリに新しいファイルを作成します。新しく作成されたファイルの名前がコンソールウィンドウに表示されていることがわかります。これは、監視対象のディレクトリ(この例ではD:\)に新しいファイルが作成されるとすぐに、FileSystemWatcher_Createdイベントがトリガーされるためです。