首先,让我试着解释一下我的工作:我有一个在 Windows 7 启动时运行的进程(注册表中的运行条目)。需要通知该进程有关位于同一台计算机上的特定文本文件的更改,但更改来自另一个系统通过本地网络上的 SMB,即有一个名为 c:\temp\MyFileToWatch.txt 的文件这台计算机,并且此文件已从本地子网上的另一台计算机更改(共享 c:\temp)。
我在 C# 中实现了一个文件系统观察器,如下所示:
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下,不行。
即使文件未在编辑器中本地打开,如何可靠地获取有关文件更改的信息?
非常感谢。