在Win7下通过网络更改文件时,FileSystemWatcher无法正常工作

时间:2012-08-31 10:12:10

标签: c# networking windows-7 filesystemwatcher

首先,让我试着解释一下我做的事情:我有一个在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下,它没有。

即使文件未在编辑器中本地打开,如何可靠地获取有关文件更改的信息?

非常感谢。

0 个答案:

没有答案