ファイルが変更されたときの通知?


111

ディスク上のファイルが変更されたときに(C#で)通知を受けるためのメカニズムはありますか?


1
FileSystemWatcherクラスとそれが発生させるイベントの詳細については、この回答を参照してください。
ChrisF

回答:



204

FileSystemWatcherクラスを使用できます。

public void CreateFileWatcher(string path)
{
    // Create a new FileSystemWatcher and set its properties.
    FileSystemWatcher watcher = new FileSystemWatcher();
    watcher.Path = path;
    /* 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;
}

// 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);
}

11
良い例をありがとう。また、変更を監視するためのブロッキング(同期)方法を探している場合は、FileSystemWatcherでメソッドWaitForChangedを使用できることも指摘しておきます。
Mark Meuer、2013

22
この例をありがとう。MSDNもほぼ同じです。また、ディレクトリツリー全体を監視したい人watcher.IncludeSubdirectories = true;もいます。
オリバー

1
OnChange実際の変化なしに発砲します(例:ctrl+s実際の変化なしにヒット)、偽の変化を検出する方法はありますか?
Mehdi Dehghani

1
@MehdiDehghani:私が知っていることではありませんが、唯一の方法は実際にファイルのスナップショットを保持し、バイト単位で現在の(おそらく変更された)バージョンと比較することです。FileSystemWatcherのみ(つまりOSがイベントをトリガした場合)、ファイルシステムレベルでのイベントを検出することが可能です。あなたのケースではCtrl + Sがそのようなイベントを引き起こします(それが起こるかどうかは実際のアプリケーションに依存します)。
Dirk Vollmar

FileSystemWatcherはクロスプラットフォームですか?
Vinigas

5

を使用しFileSystemWatcherます。変更イベントのみをフィルタリングできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.