エクスポート (0) 印刷
すべて展開

FileSystemWatcher クラス

更新 : 2007 年 11 月

ファイル システムの変更通知を待機し、ディレクトリまたはディレクトリ内のファイルが変更されたときにイベントを発生させます。

名前空間 :  System.IO
アセンブリ :  System (System.dll 内)

[IODescriptionAttribute("FileSystemWatcherDesc")]
[PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")]
[PermissionSetAttribute(SecurityAction.InheritanceDemand, Name = "FullTrust")]
public class FileSystemWatcher : Component, 
	ISupportInitialize
/** @attribute IODescriptionAttribute("FileSystemWatcherDesc") */
/** @attribute PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust") */
/** @attribute PermissionSetAttribute(SecurityAction.InheritanceDemand, Name = "FullTrust") */
public class FileSystemWatcher extends Component implements ISupportInitialize
public class FileSystemWatcher extends Component implements ISupportInitialize

指定したディレクトリの変更をウォッチするには、FileSystemWatcher を使用します。指定したディレクトリのファイルとサブディレクトリの変更をウォッチできます。ローカル コンピュータ、ネットワーク ドライブ、またはリモート コンピュータのファイルをウォッチするコンポーネントを作成できます。

すべてのファイルの変更をウォッチするには、Filter プロパティに空の文字列 ("") を設定するか、ワイルドカード ("*.*") を使用します。特定のファイルをウォッチするには、Filter プロパティにそのファイル名を設定します。たとえば、ファイル MyDoc.txt の変更をウォッチするには、Filter プロパティに "MyDoc.txt" を設定します。特定の種類のファイルの変更もウォッチできます。たとえば、テキスト ファイルの変更をウォッチするには、Filter プロパティに "*.txt" を設定します。

ディレクトリまたはファイルで、さまざまな種類の変更をウォッチできます。たとえば、ファイルまたはディレクトリの AttributesLastWrite の日付と時刻、または Size の変更をウォッチできます。NotifyFilter プロパティに NotifyFilters 値の 1 つを設定すると、実行されます。ウォッチできる変更の種類の詳細については、NotifyFilters のトピックを参照してください。

ファイルまたはディレクトリの名前変更、削除、または作成をウォッチできます。たとえば、テキスト ファイルの名前の変更をウォッチするには、Filter プロパティに "*.txt" を設定し、パラメータに Renamed を指定して WaitForChanged メソッドを呼び出します。

Windows オペレーティング システムは、FileSystemWatcher によって作成されたバッファ内のファイルの変更をコンポーネントに通知します。短時間に多くの変更が発生すると、バッファがオーバーフローすることがあります。これにより、コンポーネントはディレクトリの変更は追跡せず、ブランケットの通知だけを行います。InternalBufferSize プロパティを使用してバッファのサイズを大きくすると、そのメモリはディスクにスワップ アウトできない非ページ メモリから割り当てられるため、負荷が大きくなります。そのため、バッファはできるだけ小さくしますが、ファイル変更イベントが見落とされない程度の大きさは維持してください。バッファ オーバーフローを防ぐには、NotifyFilter プロパティと IncludeSubdirectories プロパティを使用して、不要な変更通知をフィルタで排除します。

FileSystemWatcher のインスタンスの初期プロパティ値の一覧については、FileSystemWatcher コンストラクタのトピックを参照してください。

FileSystemWatcher クラスを使用する際には、次の項目に注意してください。

  • 隠しファイルは無視されません。

  • 一部のシステムでは、FileSystemWatcher はファイルへの変更を 8.3 の短いファイル名形式を使用して報告します。たとえば、"LongFileName.LongExtension" に加えられた変更が "LongFi~.Lon" として報告されます。

  • このクラスは、すべてのメンバに適用されるリンク確認要求および継承確認要求をクラス レベルで格納します。直前の呼び出し元または派生クラスに完全信頼のアクセス許可がない場合、SecurityException がスローされます。セキュリティ要求の詳細については、「リンク確認要求」を参照してください。

フォルダのコピーと移動

オペレーティング システムと FileSystemWatcher オブジェクトは、切り取り/貼り付けアクションまたは移動アクションを、フォルダとその内容の名前変更アクションとして解釈します。ファイルが格納されたフォルダを切り取り、ウォッチ対象のフォルダに貼り付けた場合、FileSystemWatcher オブジェクトは、フォルダだけを新規フォルダとして報告します。フォルダの内容は基本的に名前が変更されるだけであるため報告されません。

フォルダの内容がウォッチ対象フォルダに移動またはコピーされたことを通知するには、次の表に示すように、OnChanged および OnRenamed の各イベント ハンドラ メソッドを提供します。

イベント ハンドラ

処理されるイベント

実行内容

OnChanged

Changed, Created, Deleted

ファイル属性の変更、作成されたファイル、および削除されたファイルを報告します。

OnRenamed

Renamed

名前が変更されたファイルまたはフォルダの新旧のパスを示します。必要に応じて再帰的に拡張できます。

イベントとバッファ サイズ

発生するファイル システム変更イベントの種類は、次に説明する複数の要因によって決まります。

  • 一般的なファイル システム操作で、複数のイベントが発生することがあります。たとえば、あるディレクトリから別のディレクトリにファイルを移動するとき、複数の OnChangedOnCreatedOnDeleted の各イベントが発生することがあります。ファイルの移動は、複数の単純な操作から構成される複雑な操作です。そのため、複数のイベントが発生します。同様に、一部のアプリケーション (ウイルス対策ソフトウェアなど) では追加のファイル システム イベントが発生し、FileSystemWatcher で検出されることがあります。

  • FileSystemWatcher は、切り替えられたり、削除されたりしない限り、ディスクをウォッチできます。CD および DVD の場合、タイム スタンプおよびプロパティが変更されることはないため、FileSystemWatcher がイベントを発生させることはありません。リモート コンピュータでコンポーネントを正しく動作させるには、必要なプラットフォームの 1 つをインストールする必要があります。

  • Service Pack 1 適用前の Windows XP、または SP2 以前の Windows 2000 で、複数の FileSystemWatcher オブジェクトが同じ UNC パスをウォッチしている場合は、その中の 1 つのオブジェクトによってのみイベントが発生します。Windows XP SP1 以降、Windows 2000 SP3 以降、または Windows Server 2003 以降のオペレーティング システムを実行しているコンピュータの場合は、すべての FileSystemWatcher オブジェクトによって適切なイベントが発生します。

  • Filter の設定によって、バッファに格納されるデータが減少することはありません。

イベントが見落とされた場合、またはバッファ サイズを超えた場合、Windows オペレーティング システムとの依存関係により、FileSystemWatcher によって Error イベントが発生することはありません。イベントを見落とさないために、次のガイドラインに従ってください。

  • InternalBufferSize プロパティを使用してバッファ サイズを大きくすることで、ファイル システム変更イベントの見落としを予防できます。

  • ロング ファイル名を使ってウォッチすることは避けます。短い名前に変更することを検討してください。

  • イベントの処理コードをできるだけ短くします。

実行時に指定したディレクトリをウォッチする FileSystemWatcher を作成する例を次に示します。コンポーネントは、ディレクトリのテキスト ファイルの LastWrite 時刻と LastAccess 時刻の変更、それらのファイルの作成、削除、名前の変更をウォッチするように設定されます。ファイルが変更、作成、または削除されると、そのファイルのパスがコンソールに表示されます。ファイルの名前を変更する場合は、古いパスと新しいパスがコンソールに出力されます。

この例では、System.Diagnostics 名前空間と System.IO 名前空間を使用します。

public class Watcher
{

    public static void Main()
    {
    Run();

    }

    [PermissionSet(SecurityAction.Demand, Name="FullTrust")]
    public static void Run()
    {
        string[] args = System.Environment.GetCommandLineArgs();

        // If a directory is not specified, exit program.
        if(args.Length != 2)
        {
            // Display the proper way to call the program.
            Console.WriteLine("Usage: Watcher.exe (directory)");
            return;
        }

        // Create a new FileSystemWatcher and set its properties.
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = args[1];
        /* Watch for changes in LastAccess and LastWrite times, and
           the renaming of files or directories. */
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
           | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        // Only watch text files.
        watcher.Filter = "*.txt";

        // Add event handlers.
        watcher.Changed += new FileSystemEventHandler(OnChanged);
        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.Deleted += new FileSystemEventHandler(OnChanged);
        watcher.Renamed += new RenamedEventHandler(OnRenamed);

        // Begin watching.
        watcher.EnableRaisingEvents = true;

        // Wait for the user to quit the program.
        Console.WriteLine("Press \'q\' to quit the sample.");
        while(Console.Read()!='q');
    }

    // Define the event handlers.
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed, created, or deleted.
       Console.WriteLine("File: " +  e.FullPath + " " + e.ChangeType);
    }

    private static void OnRenamed(object source, RenamedEventArgs e)
    {
        // Specify what is done when a file is renamed.
        Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
    }
}



public class Watcher
{
    public static void main(String[] args1)
    {
	Run();
    } 

    /** @attribute PermissionSet(SecurityAction.Demand, Name="FullTrust")
     */
    public static void Run()
    {
        String args[] = System.Environment.GetCommandLineArgs();

        // If a directory is not specified, exit program.
        if (args.length != 2) {

            // Display the proper way to call the program.
            Console.WriteLine("Usage: Watcher.exe (directory)");
            return;
        }

        // Create a new FileSystemWatcher and set its properties.
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.set_Path(args[1]);

        /* Watch for changes in LastAccess and LastWrite times, and 
           the renaming of files or directories.
         */
        watcher.set_NotifyFilter
            (NotifyFilters.LastAccess |NotifyFilters.LastWrite |
            NotifyFilters.FileName | NotifyFilters.DirectoryName);

        // Only watch text files.
        watcher.set_Filter("*.txt");

        // Add event handlers.
        watcher.add_Changed(new FileSystemEventHandler(OnChanged));
        watcher.add_Created(new FileSystemEventHandler(OnChanged));
        watcher.add_Deleted(new FileSystemEventHandler(OnChanged));
        watcher.add_Renamed(new RenamedEventHandler(OnRenamed));

        // Begin watching.
        watcher.set_EnableRaisingEvents(true);

        // Wait for the user to quit the program.
        Console.WriteLine("Press \'q\' to quit the sample.");
        while ((Console.Read() != 'q')) {

        }
    }

    // Define the event handlers.
    private static void OnChanged(Object source,FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed, created, or deleted.
        Console.WriteLine(("File: " + e.get_FullPath() + " " 
            + e.get_ChangeType()));
    } //OnChanged

    private static void OnRenamed(Object source, RenamedEventArgs e)
    {
        // Specify what is done when a file is renamed.
        Console.WriteLine("File: {0} renamed to {1}",
            e.get_OldFullPath(),e.get_FullPath());
    } //OnRenamed
} //Watcher


この型のすべてのパブリック static (Visual Basic では Shared) メンバは、スレッド セーフです。インスタンス メンバの場合は、スレッド セーフであるとは限りません。

Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98

.NET Framework および .NET Compact Framework では、各プラットフォームのすべてのバージョンはサポートしていません。サポートされているバージョンについては、「.NET Framework システム要件」を参照してください。

.NET Framework

サポート対象 : 3.5、3.0、2.0、1.1、1.0

コミュニティの追加

追加
表示:
© 2014 Microsoft