FileSystemWatcher.WaitForChanged は返されますが、ファイルにはまだロックが残っています
-
05-09-2019 - |
質問
ドキュメントを PDF プリンタードライバーに送信し、そのドライバーが特定のディレクトリに印刷するプログラムがあります。印刷後、PDFを電子メール(MailMessage)に添付して送信したいと考えています。
現在、ドキュメントをプリンターに送信し(新しいプロセスが生成されます)、FileSystemWatcher.WaitForChanged(WaitForChangedResult.Created) を呼び出していますが、オブジェクトが作成されてもまだ「印刷」が完了しておらず、PDF プリンターにはまだロックすると、そのファイルを電子メールに添付しようとするとエラーがスローされます。
- プレーンな Thread.Sleep(2000) などを検討しましたが、それは理想とははるかに異なります。
- 添付コードを try/catch ブロックに入れて失敗時にループすることも考えましたが、やはり、それは悪い知らせです。
エレガントな解決策はあまり思いつきません。
解決
WaitForChangesはの作成したイベントのを待っています。文書が作成されているとして、あなたは、通知を得る:これは、ファイルが完全に書き込まれると、ロックが除去されることを意味するものではありません。
悲しいことに、私は、ファイルを定期的にポーリング以外の良い解決策を知りません。 「すべてのロックを外し、」イベントがあった場合、あなたはそれを使用しますが、そこではありませんでした。
私は、ディレクトリのコードに私たちのPDFダンプをチェックし、私たちは、新しいファイルの開始を検出するためにWaitForChangesを使用しています。私たちは、その後、キャッチは、我々は維持キューにしようと再送信します(ファイルの上に権利を取得するために失敗)のtry {}キャッチ{}を使用します。各試みが長いために、「バックオフ」を、私たちは、検出した後、最初の試みは1秒ですまだ短いファイルにかなり応答でありながら、ファイル、第二は、2秒後で、4、8、などこれは、大きなファイルの数の再試行を減らすます。
他のヒント
まあ、限りウォッチャーは、ファイルを見て、それが変わったのたびに知らせているように、あなただけのファイルがまだ(まだ書き込まれて)ロックされているときに発生する変更通知を無視した、究極の変更通知を待つことができますファイルがアクセス可能である必要があり、その後、最後の書き込みイベントを、(あなたが最終的に時計を無効にすることができた時点で)信号を送る。
それ以外は、私は、あなたが何ができるかわからないんだけどウォッチャーはない「ファイルが閉じられていない」持っているため、イベント私の知る限ります。
私の知る限り、エラー処理せずにファイルロックをチェックする方法はありません。
PDFプリンタは、おそらく新しいプロセスを開始していますか? そして、あなたはそのプロセスを監視することができるはず、それが終了したときに、ファイルのロックが解除されます。
は、あなたがこのためにはAdobeのAcrobatを使用している場合は、(私の頭の上から、あなたは/ Nスイッチをしたい)Acrodist.exeでPDFを生成することができ、および生成されたプロセスが終了するのを待ちます。