当Excel 2007以兼容模式打开XLS文件时,FileSystemWatcher.Changed立即触发

我们使用FileSystemWatcher监视从文档pipe理系统打开的文档,如果用户保存文档,我们会问他们是否也希望在我们的系统中更新文档。

Excel 2007中的XLS文件存在问题(未validation问题在2003年不存在,但似乎只是在2007年以兼容模式打开的文件),其中Changed事件在打开文件时立即触发,然后再closures文件,即使没有改变或用户select不保存closures。 打开XLSX文件时不存在相同的行为。

我写了一个testing应用程序来validation行为,你可以在http://www.just2guys.net/SOFiles/FSWExcel.zipfind。 在应用程序中,每个NotifyFiltertypes都有一个FileSystemWatcher,所以很明显为什么 Changed事件被触发。

你能想到的任何方式只提示用户当文件实际上被保存在用户的某种方式? 我可以在Process.Start被调用之后开始监视文件,这允许我在打开文档时跳过消息,但即使在没有任何更改的情况下,我仍然可以在closures文档时看到该文件。

我注意到这个与Word,你可以简单地重现它:

如果使用Office应用程序打开.doc或.xls文件,则时间戳将更改为打开文档的时间。

如果closures应用程序,则时间戳将重置为其原始值(只有在保存时才会执行)。

所以对于Office文件,你需要两个额外的检查:

  • 打开时,如果时间戳设置为当前时间,请检查文件是否可以单独打开

  • 在closures时,检查时间戳是否“接近”当前的date和时间,或检查文件的存档标志

文件系统守望者通常是邪恶的。 它烧了很多人,因为它在文件被完全写入之前注册事件。

我们已经能够通过移除它来代替睡眠循环模式,在采取行动之前添加静态延迟(Thread.Sleep),或者两者的组合(接收事件,产生线程和循环在线程中,直到你认为没有任何东西正在通过检查最后的moddate/时间来更新它)。

Excel每次打开文件时都会创build一个临时文件 – 这可能是您所看到的事件。 检查FileSystemEventArgs的Name属性,如果文件名以'〜'开头,则忽略该事件。