1

首先,让我试着解释一下我的工作:我有一个在 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下,不行。

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

非常感谢。

4

0 回答 0