FileSystemWatcher.WaitForChanged返回,但文件仍然存在锁定

时间:2009-02-18 15:21:33

标签: c# filesystemwatcher file-locking

我有一个程序将文档发送到pdf打印机驱动程序,该驱动程序打印到特定目录。打印后我想将pdf附加到电子邮件(MailMessage)并将其发送出去。

现在,我将文档发送到打印机(生成一个新进程),然后调用FileSystemWatcher.WaitForChanged(WaitForChangedResult.Created)但是当创建对象时,它仍然没有完成“打印”和pdf打印机仍然有一个锁定,当我尝试将该文件附加到电子邮件时抛出错误。

  • 我考虑过一个简单的Thread.Sleep(2000)或其他什么,但这远远不够理想。
  • 我考虑将附件代码放在try / catch块中并在失败时循环,但同样,这只是个坏消息。

我无法想到一个优雅的解决方案。

4 个答案:

答案 0 :(得分:3)

WaitForChanges 正在等待创建的事件,因为它已编码。在创建文档时,您会收到通知:这并不意味着文件已完全写入并且锁被删除。

可悲的是,除了定期轮询文件之外,我不知道一个好的解决方案。如果有“删除所有锁定”事件,您可以使用它,但没有。

我刚检查了我们的PDF转储到目录代码,我们只使用WaitForChanges来检测新文件的开始。然后我们使用try {} catch {},其中catch(未能获得对文件的权限)将尝试重新提交到我们维护的队列中:每次尝试都“退避”更长时间,因此我们检测到第一次尝试是1秒该文件,第二个是2秒后,然后是4,8,等等。这减少了大文件的重试次数,同时仍然对较短的文件做出了相当的响应。

答案 1 :(得分:2)

好吧,只要观察者正在观看文件并在知道文件发生变化时让您知道,您就可以忽略文件仍然被锁定(仍然被写入)时发生的更改通知,并等待最终更改通知将发出最后一次写入事件的信号,之后文件应该可以访问(此时你最终可以禁用该表)。

除此之外,我不确定你能做什么,因为观察者没有“文件关闭”事件AFAIK。

答案 2 :(得分:0)

AFAIK无法在没有错误处理的情况下检查文件锁。

pdf打印机是否可以使用新进程启动? 然后你应该能够监控这个过程,当它退出你的文件时,它将被解锁。

答案 3 :(得分:0)

如果您正在使用Adobe的Acrobat,您可以使用Acrodist.exe生成PDF(在我的头顶,您需要/ N切换),然后等待生成的进程退出