3

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

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

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

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

4

3 回答 3

3

我在 Word 中注意到了这一点,您可以简单地复制它:

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

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

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

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

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

于 2010-03-08T20:23:30.147 回答
1

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

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

于 2010-03-08T20:30:29.573 回答
0

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

于 2010-03-08T18:33:01.400 回答