37

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 の動作を復元する方法があるかどうかも知りたいと思っています。

4

5 に答える 5

1

編集前/編集後のファイルのアーカイブビットを確認してください。あなたのコードは属性の変更のみを検索しているので、Windows 7はファイルのアーカイブビットを更新していると思いますが、Windows8は更新していません。

于 2012-12-27T18:19:57.390 に答える
1

どこにでもコメントが多すぎます。次の問題を認識していることを確認するために回答を追加します。

どうやら問題は、イベントがバックグラウンド スレッドで発生し、UI スレッドへの呼び出しをマーシャリングする必要があることです。

私は FileSystemWatcher クラスで多くの問題を経験しており、https ://stackoverflow.com/a/22768610/129130 で説明しているように、使用しないことにしました。ただし、私が経験した問題は、スレッド同期の問題やハードウェアの問題が原因だった可能性があります。

于 2014-05-16T21:01:12.477 に答える
0

FileSystemWatcher は信頼できないことで有名です。すべてのイベントをサブスクライブして、他のイベントが発生するかどうかを確認してください。FileSystemWatcher を使用する代わりに、タイマーを使用して定期的に (2 秒に 1 回など) ファイルの変更を調べることができます。

于 2012-12-12T06:54:56.020 に答える