0

ドキュメントをpdfプリンタードライバーに送信し、そのドライバーが特定のディレクトリに印刷するプログラムがあります。印刷後、PDFを電子メール(MailMessage)に添付して送信したいと思います。

現在、ドキュメントをプリンターに送信し(新しいプロセスを生成します)、FileSystemWatcher.WaitForChanged(WaitForChangedResult.Created)を呼び出しますが、オブジェクトが作成されても「印刷」は行われず、PDFプリンターにはまだそのファイルを電子メールに添付しようとするとエラーが発生します。

  • プレーンなThread.Sleep(2000)などを検討しましたが、それは理想的とは言えません。
  • 添付コードをtry/catchブロックに入れて失敗時にループすることを検討しましたが、これも悪いニュースです。

私は本当にエレガントな解決策を考えることはできません。

4

4 に答える 4

3

WaitForChanges は、コーディングしたとおりに作成されたイベントを待機しています。ドキュメントが作成されると、通知が表示されます。これは、ファイルが完全に書き込まれ、ロックが解除されたことを意味するものではありません。

残念ながら、ファイルを定期的にポーリングする以外に良い解決策はわかりません。「すべてのロックが削除されました」イベントがあった場合、それを使用できますが、ありません。

PDF ダンプをディレクトリ コードにチェックしたところ、WaitForChanges のみを使用して新しいファイルの開始を検出しました。次に、try {} catch {} を使用します。ここで、catch (ファイルに対する権限の取得に失敗) が試行を管理しているキューに再送信します。 2 秒後、次に 4、8 などです。これにより、大きなファイルの再試行回数が減り、短いファイルにはかなり反応します。

于 2009-02-18T15:29:09.587 に答える
2

まあ、ウォッチャーがファイルを監視していて、ファイルが変更されるたびに通知している限り、ファイルがまだロックされている(まだ書き込まれている)間に発生する変更通知を無視して、最終的な変更通知を待つことができます。最後の書き込みイベント。その後、ファイルにアクセスできるようになります(この時点で、最終的にウォッチを無効にできます)。

それ以外は、ウォッチャーには「ファイルが閉じられた」イベントAFAIKがないため、何ができるかわかりません。

于 2009-02-18T15:25:58.940 に答える
0

これにAdobeのAcrobatを使用している場合は、Acrodist.exeを使用してPDFを生成し(頭のてっぺんから/ Nスイッチが必要です)、生成されたプロセスが終了するのを待つことができます。

于 2009-02-18T15:53:20.467 に答える
0

私の知る限り、エラー処理なしでファイル ロックをチェックする方法はありません。

PDFプリンターはおそらく新しいプロセスで始まりますか?その後、そのプロセスを監視できるようになり、終了するとファイルのロックが解除されます。

于 2009-02-18T15:38:25.383 に答える