我想,当一个文件在磁盘上的更新,以得到一个通知。我有兴趣在发生刷新时立即获取此通知,但似乎FileSystemWatcher只会在流打开或关闭时发送事件。FileSystemWatcher的改变事件(“LastWrite”)是不可靠的
在下面我写一个文件,并多次刷新缓冲区到磁盘的代码。然而,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!");
}
}
UPDATE 1
我已经纠正了日期时间的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!
谢谢!
'FileSystemWatcher'是靠不住的出于很多原因。如果您需要所有更新的可靠通知,请更改双方并在它们之间使用其他显式通信通道。 – 2012-03-05 08:51:24
我同意,这将是一个更好的选择,但在我的情况下是不可能的。 – VitalyB 2012-03-05 09:40:42
啊,我从你的示例代码/描述中假设你是在控制这个集成问题两边的代码。如果情况并非如此,不知道我会推荐什么。我会想一想。 – 2012-03-05 10:12:41