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