0

DeleteAfterCloseオプションを指定して、.netのFileStreamオブジェクトを使用してファイルを作成し、そのファイルへの読み取りアクセスを許可することは可能ですか?

私は使用してみました:

System.IO.FileStream strBMP = new System.IO.FileStream(sFileName, System.IO.FileMode.Create, System.Security.AccessControl.FileSystemRights., System.IO.FileShare.ReadWrite, 1024, System.IO.FileOptions.DeleteOnClose);

しかし、読み取りを試みる他のオブジェクトはファイル共有違反を取得します。

ファイル(tif)を作成し、COMオブジェクト(MODI)を使用してイメージに対してOCRを実行しているため、これを実行しようとしています。私の問題は、MODI comオブジェクトでcloseメソッドを呼び出した後でも、MODI comオブジェクトが完全に終了していないため、System.File.Deleteメソッドを使用してファイルを削除できないことです。DeleteAfterCloseオプションを使用してファイルを作成し、設定されたファイルの読み取りを許可できるとしたら、共有違反を通過させる方法がわかりません。可能であれば、それが可能である場合でも同様です。

4

1 に答える 1

0

2 つのプロセスが同じファイルを開いている場合、2 番目のファイルを正常に開くには、両方のプロセスが互換性のあるファイル共有フラグのセットを指定する必要があります。ファイルを開くときに MODI によって渡されるフラグを制御できない限り、おそらく共有違反を回避する方法はありません。たとえば、排他モードでファイルを開こうとすると、FileStream コンストラクターに渡すフラグに関係なく、プロセスがファイルを開いている場合は常に失敗します。

適切に設計された COM オブジェクト (ここではそうである場合とそうでない場合があります) は、リリース時にファイルを開いたままにしないため、問題は .NET COM 相互運用層に関連している可能性があります。一部の MODI COM オブジェクトが予期しない方法で存続している可能性があります。実際、この問題に関する他のフォーラムのスレッドはすべてマネージ コードに言及しています。、、およびのいくつかの組み合わせが問題の解決に役立つ可能性がありますが、決定的な解決策を (まだ) 書いている人はいないようであり、これらの関数を使用することは非常にハックで非常に脆弱に感じます。Marshal.FinalReleaseComObjectGC.CollectGC.WaitForPendingFinalizers

于 2010-07-05T18:50:47.790 に答える