FileSystemWatcher を使用して、アプリケーションの外部でファイルの変更を監視するコードがいくつかあります。
Windows 7 で .NET 4 を使用すると、以下のコードは、アプリの実行中にメモ帳などのアプリケーションでファイルが編集および保存されたことを検出します。ただし、Windows 8 で .NET 4 を使用すると、このロジックは機能しません。具体的には、FileSystemWatcher の Changed イベントは発生しません。
public static void Main(string[] args)
{
const string FilePath = @"C:\users\craig\desktop\notes.txt";
if (File.Exists(FilePath))
{
Console.WriteLine("Test file exists.");
}
var fsw = new FileSystemWatcher();
fsw.NotifyFilter = NotifyFilters.Attributes;
fsw.Path = Path.GetDirectoryName(FilePath);
fsw.Filter = Path.GetFileName(FilePath);
fsw.Changed += OnFileChanged;
fsw.EnableRaisingEvents = true;
// Block exiting.
Console.ReadLine();
}
private static void OnFileChanged(object sender, FileSystemEventArgs e)
{
if (File.Exists(e.FullPath))
{
Console.WriteLine("File change reported!");
}
}
NotifyFilter を変更して、NotifyFilters.LastWrite も含めることができることを理解しています。これにより、問題を解決できます。ただし、このコードが Windows 7 では機能するのに、Windows 8 では Changed イベントを発生させられない理由を理解したいと思います。また、Windows 8 での実行時に (NotifyFilter を変更せずに) Windows 7 の FileSystemWatcher の動作を復元する方法があるかどうかも知りたいと思っています。