FileSystemWatcher 更改事件(对于“LastWrite”)不可靠

Vit*_*lyB 7 .net c# filesystemwatcher

我试图在磁盘上更新文件时收到通知。我有兴趣在发生刷新时立即收到此通知,但是,似乎 FileSystemWatcher 只会在流打开或关闭时发送事件。

在下面的代码中,我正在写入一个文件并反复将缓冲区刷新到磁盘。然而,FileSystemWatcher 只在写入开始和结束时通知我一次。

有没有其他方法可以获取这些通知?或者我应该为此使用轮询?

编码:

class Program
{
    static void Main(string[] args)
    {
        FileSystemWatcher watcher = new FileSystemWatcher(Environment.CurrentDirectory, "Test.txt");
        watcher.Changed += watcher_Changed;
        watcher.EnableRaisingEvents = true;

        using(TextWriter writer = new StreamWriter("Test.txt"))
        {
            WriteData(writer);
            WriteData(writer);
            WriteData(writer);
            WriteData(writer);
        }

        Thread.Sleep(10000);
    }

    private static void WriteData(TextWriter writer)
    {
        writer.WriteLine("Hello!");
        writer.Flush();
        Console.WriteLine(DateTime.Now.ToString("T") + "] Wrote data");
        Thread.Sleep(3000);
    }

    static void watcher_Changed(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine(DateTime.Now.ToString("T") + "] Watcher changed!");
    }
}
Run Code Online (Sandbox Code Playgroud)

更新 1

我已更正 DateTime 的 ToString 函数以显示秒数。这是上面代码的输出:

11:37:47 AM] Watcher changed!
11:37:47 AM] Wrote data
11:37:50 AM] Wrote data
11:37:53 AM] Wrote data
11:37:56 AM] Wrote data
11:37:59 AM] Watcher changed!
Run Code Online (Sandbox Code Playgroud)

谢谢!

adr*_*anm 8

它与 FileSystemWatcher 无关。观察者对文件系统的 LastWrite 属性的更新做出反应。

例如,NTFS 不会在每次写入时更新 LastWrite。该值被缓存并仅在流关闭或在其他未指定的时间写入。这份文件

时间戳会因各种原因在不同时间更新。关于文件时间戳的唯一保证是在关闭进行更改的句柄时正确反映文件时间。[...] NTFS 文件系统将文件最后一次访问时间的更新延迟至上次访问后 1 小时

我假设类似的缓存适用于写入