8

自動的に削除される一時ファイルを作成しようとしています。

stream = new FileStream(
           tmpFilePath, 
           FileMode.OpenOrCreate, 
           FileAccess.ReadWrite, 
           FileShare.ReadWrite, 
           4096, 
           FileOptions.DeleteOnClose|FileOptions.RandomAccess
           );

このファイルは、FileStream も作成するサードパーティ API によって使用されます。

stream = new FileStream(
          tmpFilePath, 
          FileMode.Open, 
          FileAccess.Read, 
          FileShare.Read);

考えられるすべてのフラグの組み合わせを試したと思いますが、「別のプロセスで使用されているため、プロセスはファイル 'XXX'にアクセスできません...」というメッセージが常に表示されます。

私は何か間違ったことをしていますか?回避策はありますか?

4

7 に答える 7

4

ドキュメントによると、はい。

http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx

抜粋:

読み取り:読み取りのためにファイルを後で開くことができます。このフラグが指定されていない場合、(このプロセスまたは別のプロセスによる)読み取りのためにファイルを開く要求は、ファイルが閉じられるまで失敗します。ただし、このフラグが指定されている場合でも、ファイルにアクセスするには追加のアクセス許可が必要になる場合があります。

于 2011-11-21T16:07:15.013 に答える
0

既存のストリームをサード パーティの Api に渡すことができます。または、サード パーティの API パスStreamReaderインスタンスの読み取り専用モードのみが必要な場合は、

    using (var stream = new FileStream("trace.txt", FileMode.OpenOrCreate,FileAccess.ReadWrite))
    {
        using (var anotherStream = new StreamReader(stream))
        {
            //magic here
        }
    }
于 2011-11-21T16:07:55.533 に答える
0

この一連の呼び出しは、サードパーティ API が を使用する場合FileShare.ReadWrite、またはオープンが を使用する場合にのみ機能しますFileAccess.Read

あなたはそれを読み取り/書き込みで開いていますが、他の人も読み取り/書き込みで開くことができます。サードパーティのコードが読み取り専用で開こうとしていますが、他の人もそれを開くことができますが、読み取り専用としてのみ開いています。まだ読み書き可能で開いているため、これは失敗します。

サードパーティのコードを変更できないと仮定すると、代わりに次のパターンを採用する必要があります。

  1. 現在の状態でファイルを開きますが、DeleteOnCloseフラグは付けません。
  2. 他のコードが読み取る必要があるコンテンツを記述します。
  3. ファイルを閉じます。
  4. 必要に応じてFileAccess.Read(および場合によってはDeleteOnClose) で再度開きます。
  5. サードパーティのコードを呼び出します。
  6. 必要なその他の読み取り (書き込みは不可) を行います。
于 2015-12-09T03:30:05.973 に答える
0

1 つのファイルを複数のプロセスで共有する方法として、メモリ マップト ファイルを使用したい場合があるように思えます。

http://msdn.microsoft.com/en-us/library/system.io.memorymappedfiles.memorymappedfile.aspx

于 2011-11-21T16:02:42.510 に答える
0

問題は、最初に作成したストリームがまだ開いていることです。ファイルを作成してから解放し(ストリームを閉じる)、サードパーティの API にその機能を実行させてから、ファイルを削除する必要があります。これらすべてを IDispoable であるクラスにまとめることは、良い解決策かもしれません。コンストラクタでファイルを作成して解放し、サードパーティの作業をメソッドでラップし、dispose メソッドで削除します。

于 2011-11-21T16:04:00.120 に答える