无法使用FileSystemWatcher监控word文档

时间:2011-09-27 04:20:28

标签: c# .net vb.net filesystems filesystemwatcher

我有一个包含多个word文档的文件夹。我需要监视此文件夹以查看这些word文档中的任何更改。我面临以下问题:

  1. FileSystemWatcher从不报告要更改的文件的确切名称。例如,对于文件abc.doc,它会在第一次保存时报告“〜$ abc.doc已更改”。
  2. 对于该文件的所有后续保存,不会调用以下代码中的OnChanged事件。当我将过滤器更改为watcher.Filter = "*.*"时,我发现对于后续保存,它会报告“~WRL0001.tmp已更改”。
  3. 所以底线是我永远不知道文件的确切名称已经改变。

    我正在使用以下代码

    public static void Main()
    {
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = @"C:\Users\Administrator\Documents\"; //"
        watcher.NotifyFilter = NotifyFilters.Size;
        watcher.Filter = "*.doc";
        watcher.Changed += new FileSystemEventHandler(OnChanged);
    
        watcher.EnableRaisingEvents = true;
    
        Console.WriteLine("Press \'q\' to quit the sample.");
        while (Console.Read() != 'q') ;
    }
    
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
    }
    

2 个答案:

答案 0 :(得分:3)

  

文件系统观察程序从不报告文件的确切名称   改变。例如,对于文件abc.doc,它报告“〜$ abc.doc is   在第一次保存时改变了。

原因是Word在打开原始文件的当前目录中创建了几个临时文件,并且在创建新文件时也会触发FileChanged事件。实际上,FileSystemWatcher会触发FileCreated,然后触发FileChanged事件。由于您没有订阅FileCreated,因此只能看到FileChanged通知。

  

对于该文件的所有后续保存,中的OnChanged事件   以下代码未被调用。当我将过滤器更改为   watcher.Filter =“。”,我发现,对于后续保存,它会报告   “~WRL0001.tmp已更改”。

与上述相同。

但是我对你的问题感到好奇,我对你的程序进行了一些改动并修改如下(仅发布相关的行):

watcher.NotifyFilter =   NotifyFilters.Attributes;
watcher.Filter = "*.doc";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;

然后我看到保存文件时控制台上打印的文件的实际名称。当我查看原始文档中的哪些属性从一个保存更改为下一个保存时,我注意到修订号增加了1(我知道,从操作系统的角度来看,修订号不是文件属性)。我确信其他属性 - 缺乏更好的词 - 已经改变了。如果您想将NotificationFilter设置为NotifyFilters.Attributes;以使其正常工作,则由您自行决定但是,例如让NotificationFilter =NotifyFilters.Size | NotifyFilters.LastWrite;无法使用它是绝对奇怪的。

enter image description here

答案 1 :(得分:0)

通常会保存到随机文件名,以保持文件更改操作的原子性,避免在写入失败时销毁用户的数据。

通常顺序:

  • 打开文件“myfile.ext”
  • 修改
  • 将更改文件写入同一文件夹中的“some_temp_name”
  • 如果写入成功将“myfile.ext”重命名为“myfile.old”,则将“some_temp_name”重命名为“myfile.ext”。

根据程序,序列可能不同 - 即最后重命名可以是文件复制,也可以是原始文件的删除。您必须在目标文件夹中监视所有类型的更改,并观察您感兴趣的文件的最终更新(可能是创建通知而不是更改)。