0

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

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

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

我真的想不出一个优雅的解决方案。

4

4 回答 4

3

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

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

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

于 2009-02-18T15:29:09.587 回答
2

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

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

于 2009-02-18T15:25:58.940 回答
0

AFAIK 没有错误处理就无法检查文件锁。

pdf打印机是否从一个新进程开始?然后您应该能够监视该过程,并且当它退出时,您的文件将被解锁。

于 2009-02-18T15:38:25.383 回答
0

如果您为此使用 Adob​​e 的 Acrobat,您可以使用 Acrodist.exe 生成 PDF(在我的脑海中,您想要 /N 开关),然后等待生成的进程退出

于 2009-02-18T15:53:20.467 回答