我有一个程序将文档发送到pdf打印机驱动程序,该驱动程序打印到特定目录。打印后我想将pdf附加到电子邮件(MailMessage)并将其发送出去。
现在,我将文档发送到打印机(生成一个新进程),然后调用FileSystemWatcher.WaitForChanged(WaitForChangedResult.Created)但是当创建对象时,它仍然没有完成“打印”和pdf打印机仍然有一个锁定,当我尝试将该文件附加到电子邮件时抛出错误。
我无法想到一个优雅的解决方案。
答案 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切换),然后等待生成的进程退出