まず最初に、私が何をしているのかを説明させてください。Windows 7 の起動時に実行されるプロセスがあります (レジストリの実行エントリ)。そのプロセスは、同じコンピューター上にある特定のテキストファイルの変更について通知する必要がありますが、変更はローカルネットワーク上の SMB を介して別のシステムからのものです。つまり、c:\temp\MyFileToWatch.txt というファイルがあります。このファイルは、ローカル サブネット上の別のコンピューターから変更されます (c:\temp は共有されます)。
次のように C# で filesystemwatcher を実装しました。
FileSystemWatcher incoming = new FileSystemWatcher();
incoming.Path = @"c:\temp\";
incoming.NotifyFilter = NotifyFilters.FileName |
NotifyFilters.LastAccess |
NotifyFilters.LastWrite |
NotifyFilters.DirectoryName;
incoming.Filter = "MyFileToWatch.txt";
incoming.Changed += new FileSystemEventHandler(OnChanged);
incoming.EnableRaisingEvents = true;
OnChanged では、次のようなメッセージを出力します。
public static void OnChanged(object source, FileSystemEventArgs e)
{
Console.WriteLine("{0} : MyFileToWatch.txt changed", System.DateTime.Now);
}
私が今抱えている問題は、ファイルが実際に変更されていることですが、少なくとも現在のコンピューターのどのプログラムでも MyFileToWatch.txt が開かれていない限り、通知を受け取れません。ただし、このファイルをエディターで開くと、ファイルの変更が正しく認識され、OnChanged が実際に呼び出されます。ファイルがローカルで開かれていない場合、イベントは発生しません。
プロセスを実行したときのログは次のようになり、MyFileToWatch.txt は数回変更されます (最初の変更のみ取得します)。
8/31/2012 10:24:58 AM : MyFileToWatch.txt Changed
ただし、ファイルが Ultraedit などのエディターで開かれている場合、ログは次のようになります。
8/31/2012 10:10:37 AM : MyFileToWatch.txt Changed
8/31/2012 10:11:08 AM : MyFileToWatch.txt Changed
8/31/2012 10:11:15 AM : MyFileToWatch.txt Changed
8/31/2012 10:11:18 AM : MyFileToWatch.txt Changed
8/31/2012 10:11:20 AM : MyFileToWatch.txt Changed
8/31/2012 10:11:31 AM : MyFileToWatch.txt Changed
8/31/2012 10:11:48 AM : MyFileToWatch.txt Changed
8/31/2012 10:11:54 AM : MyFileToWatch.txt Changed
8/31/2012 10:11:59 AM : MyFileToWatch.txt Changed
8/31/2012 10:12:06 AM : MyFileToWatch.txt Changed
8/31/2012 10:12:25 AM : MyFileToWatch.txt Changed
誰もその奇妙な行動の説明を持っていますか? 奇妙な点は、Windows XP ではどちらの場合も機能するが、Win7 では機能しないことです。
ファイルがエディターでローカルに開かれていない場合でも、ファイルの変更に関する情報を確実に取得するにはどうすればよいですか?
どうもありがとう。