2015年6月9日火曜日

C#のFileSystemWatcherでファイル監視が効かなくなることがある話

C#で特定のファイルに対する変更を監視するのに、System.IO.FileSystemWatcherを使うことがあるかと思いますが、そのときに気を付けるべき点がありそうです。

以下は、C:\work\test.txtというファイルの削除を監視するサンプルコードです。
(Visual Studio Express 2013 for DesktopとNET Framework 4.5で検証しています)
FileSystemWatcher watcher
  = newFileSystemWatcher(@"C:\work", @"test.txt"); 
watcher.WaitForChanged(WatcherChangeTypes.Deleted); 
System.Console.WriteLine("File has been deleted");

このプログラムは、実行前に対象のファイルが存在し、その後変更が加えられない場合には正しく機能しますが、あとからこのファイルを作成したり、このファイルを同名のファイルで上書きしてしまうと、ファイルの削除を検知できなくなります。

このような状況でもきちんと機能させるには、WaitForChanged()を使うのではなく、イベントハンドラーを使って非同期処理を行う必要があります。
FileSystemWatcher watcher =  
   new FileSystemWatcher(@"C:\work", @"test.txt");
watcher.Deleted += (sender, eventArgs) =>
{
    System.Console.WriteLine("File has been deleted.");
};
watcher.EnableRaisingEvents = true;

0 件のコメント:

コメントを投稿