0

私が制御できないサードパーティのアプリケーションによって作成されたファイルのコンテンツを開いて処理する必要があるイベント ハンドラーを実装しています。「C# 4.0 の概要」(495 ページ) のメモで、ファイルが完全に読み込まれる前にファイルを開くリスクについて警告されています。だから私はこの出来事をどのように管理するのか疑問に思っています。イベントハンドラーの負荷を最小限に抑えるために、ハンドラーにファイル名をキューに挿入するだけで、処理を管理する別のスレッドを用意することを検討していますが、とにかく、書き込みが確実に行われるようにするにはどうすればよいですか?が完了し、ファイルの読み取りは安全ですか? ファイルサイズは任意です。

アイデア?ありがとう

4

3 に答える 3

1

必要なことを実現するための信頼できる方法は、FileSystemWatcher +NTFSUSNジャーナルを使用することです。予想よりも複雑かもしれませんが、FileSystemWatcherだけでは、新しく作成されたファイルが閉じられたことを確認できません。

-最初に、FileSystemWatcherは、ファイルがいつ作成されるかを認識します。そこから完全なファイルパスが得られ、ファイルの一意のIDを取得するのに1〜2ピンボークします(これは、ファイルの存続期間全体にわたって追跡するのに役立ちます)。

-次に、ドライブで発生するすべてを追跡するUSNジャーナルを読みます。新しいファイルのIDに対応するエントリをフィルタリングし、「Close」イベントのあるエントリに到達するまでジャーナルを読み取ります。

そこから、ファイルが特別な方法で操作されない限り(ファイルを生成するアプリケーションによって何度も開かれたり閉じられたり)、ファイルを読んでやりたいことを何でも安全に行うことができます。

USNジャーナルパーサーの本当に優れたC#実装は、StCroixSkipperの作業であり、http://mftscanner.codeplex.com/で入手できます

興味があれば、プロジェクトで使用しているUSNジャーナルについてさらにサポートを提供できます。

于 2012-09-25T13:33:10.227 に答える
1

私たちの回避策は、特定の拡張子を監視することです。アップロード時の拡張子は「.tmp」です。アップロードが完了すると、適切な拡張子を持つように名前が変更されます。

もう 1 つの方法は、サーバーに try/catch ブロックでファイルの移動を試行させることです。ファイルのアップロードが完了していない場合、ファイルを移動しようとすると例外がスローされるため、待機してから再試行します。

于 2012-09-25T12:27:57.723 に答える
0

現実的に、あなたは知ることができません。他のアプリケーションの「書き込み」操作がファイルを開くことであり、他のすべてのユーザーへの書き込みアクセスを拒否する場合、それが完了したら、ファイルを閉じます。通知を受け取ったら、書き込みアクセスを要求しているファイルを開くだけで、それが失敗した場合は、操作が完了していないことがわかります。しかし、「書き込み」操作が、ファイルを開いたり、書き込んだり、ファイルを閉じたり、ファイルを再度開いたり、再度書き込んだりすることである場合は、ほとんど運がありません。

私が見た最善の解決策は、最後の通知の後にタイマーを設定することです。タイマーが経過したら、書き込み用にファイルを開いてみてください。可能であれば、「操作」が完了したと想定して、必要なことを行います。オープンに失敗した場合は、操作がまだ進行中であると想定して、もう少し待ちます。

もちろん、絶対確実なものはありません。上記にもかかわらず、ファイルで必要なことをしている間に別の操作が開始され、相互作用の問題が発生する可能性があります。

于 2012-09-25T13:12:22.983 に答える