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

时间:2010-03-08 18:28:03

标签: .net excel excel-2007 filesystemwatcher

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

我们在Excel 2007中遇到了XLS文件的问题(尚未验证2003年不存在该问题,但它似乎只是在2007年以兼容模式打开的文件),其中Changed事件在打开时立即触发文件,然后在关闭文件时再次,即使没有任何改变或用户选择不在结束时保存。打开XLSX文件时,不存在相同的行为。

我编写了一个测试应用来验证行为,您可以在(http://www.just2guys.net/SOFiles/FSWExcel.zip)找到该行为。在应用程序中,每个NotifyFilter类型都有一个FileSystemWatcher,因此很明显为什么触发了Changed事件。

您可以想到只有在用户以某种方式实际保存文档时才提示用户?我可以在调用Process.Start之后开始监视文件,这允许我在打开文档时跳过该消息,但是在关闭文档时我仍然得到一个,即使没有任何更改。

3 个答案:

答案 0 :(得分:3)

我用Word注意到了这一点,你可以简单地重现它:

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

如果您关闭应用程序,时间戳将重置为其原始值(仅当您执行了保存时)。

因此,对于Office文件,您需要另外两项检查:

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

  • 关闭,检查时间戳是否“接近”当前日期和时间,或检查文件的存档标志

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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