.net FileSystemWatcher.Changed在Excel 2007以兼容模式打开XLS文件时立即激发

.net FileSystemWatcher.Changed在Excel 2007以兼容模式打开XLS文件时立即激发,.net,excel,excel-2007,filesystemwatcher,.net,Excel,Excel 2007,Filesystemwatcher,我们使用FileSystemWatcher监视从文档管理系统打开的文档,如果用户保存了文档,我们会询问他们是否也希望在我们的系统中更新文档 Excel 2007中的XLS文件存在问题(尚未验证2003年不存在此问题,但似乎只是在2007年以兼容模式打开的文件),其中更改的事件在打开文件时立即触发,然后在关闭文件时再次触发,即使没有任何更改或用户选择在关闭时不保存。打开XLSX文件时不存在相同的行为 我编写了一个测试应用程序来验证该行为,您可以在()中找到。在该应用程序中,每种NotifyFilt

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

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

我编写了一个测试应用程序来验证该行为,您可以在()中找到。在该应用程序中,每种NotifyFilter类型都有一个FileSystemWatcher,因此可以清楚地看出触发更改事件的原因


当用户以某种方式实际保存文档时,您是否可以想到只提示用户?我可以在进程结束后开始监视文件。调用start可以在打开文档时跳过该消息,但在关闭文档时仍然会收到一条消息,即使没有任何更改。

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

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

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

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

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

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

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


    • 文件系统监视者通常是邪恶的。它会烧死很多人,因为它会在文件完全写入之前注册事件


      我们可以通过移除它来代替睡眠循环模式,在采取行动之前添加一个静态延迟(Thread.sleep),或者二者的组合(接收事件,生成一个线程,并在线程中循环,直到您认为没有任何东西通过检查上一个mod日期/时间来更新它)

      不,不是这样。首先,它是已更改的事件(而不是已创建的),其次,我正在筛选Filter属性中的特定文件名。它肯定会触发该特定文件的已更改事件,但只有当它是XLS文件时,而不是XLSX文件时,我才能通过调用进程后立即启动监视来摆脱打开的事件。启动,但关闭让我感到悲伤。似乎检查时间戳以查看它是否在当前时间的一定时间内可以工作,如果是,则提示。如果他们在文档中按下保存按钮,您的未结支票不会以同样的方式失败吗?也许我看错了。我将尝试您的建议,并适当地进行标记。这仍然很混乱,因为用户保存不会为office文档发出LastWrite通知,但它们会为其他所有操作发出通知,但这对我的进步有很大帮助,我很有信心我能想出一个解决方案。有趣的是,我认为我们在使用它的两种情况下都避免了这个问题,因为我们不会在事件期间立即触发对文件的任何访问。在一种情况下,它被添加到稍后处理的队列中,而在另一种情况下,我们会提示用户,这两种情况都需要足够的时间来允许文件完全保存。不过,如果我们在其他地方使用它,我会记住这一点。