我有一个包含多个word文档的文件夹。我需要监视此文件夹以查看这些word文档中的任何更改。我面临以下问题:
FileSystemWatcher
从不报告要更改的文件的确切名称。例如,对于文件abc.doc,它会在第一次保存时报告“〜$ abc.doc已更改”。OnChanged
事件。当我将过滤器更改为watcher.Filter = "*.*"
时,我发现对于后续保存,它会报告“~WRL0001.tmp已更改”。所以底线是我永远不知道文件的确切名称已经改变。
我正在使用以下代码
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);
}
答案 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;
无法使用它是绝对奇怪的。
答案 1 :(得分:0)
通常会保存到随机文件名,以保持文件更改操作的原子性,避免在写入失败时销毁用户的数据。
通常顺序:
根据程序,序列可能不同 - 即最后重命名可以是文件复制,也可以是原始文件的删除。您必须在目标文件夹中监视所有类型的更改,并观察您感兴趣的文件的最终更新(可能是创建通知而不是更改)。