8

前に説明したように、BinaryReader または BinaryWriter が閉じられると、その基になる Stream も閉じられます (aargh)。この状況を考えてみましょう: ルーチンRに MemoryStream が渡されますM。いくつかのものを書き込んでからM、それを別のルーチンに渡してさらに処理したいと思います(必ずしも書き込みではありません)。便宜上、MBinaryWriter でラップして書き込みを行いたいと思います。書いた後、BinaryWriter は完了しましたが、M.

void R(MemoryStream M)
{
    using (B = new BinaryWriter(M))
    {
        // write some stuff using B
    }

    S(M);  // now pass M to another routine for further processing
}

しかし、BinaryStream を閉じずに破棄することはできませんM

Q: 次のいずれかを行う方法はありますか?

  • 基になる byte[] を MemoryStream から抽出し、
  • ストリームのクローン
  • 閉じたストリームを再び開く
4

7 に答える 7

7

を使用して、基になる byte[] バッファーを取得することをお勧めします

byte[] buffer = ms.GetBuffer();

次に、Array.Copy() メソッドを使用してバイト データをコピーします。それを使用して新しいストリームを自由に作成できます。

于 2009-10-27T21:17:59.867 に答える
5

MiscUtilのようなものを使用できます。これMiscUtil.IO.NonClosingStreamWrapperはa をラップし、単純に/要求を無視します。この目的のためだけに。StreamCloseDispose

void R(MemoryStream M)
{
    using (B = new BinaryWriter(new NonClosingStreamWrapper(M)))
    {
        // write some stuff using B
    }

    S(M);  // now pass M to another routine for further processing
}    
于 2009-10-27T21:40:56.037 に答える
2

あなたはできる:

  • M.ToArray() を呼び出して、ストリームをバイト配列として取得します。
  • BinaryWriter をサブクラス化し、Dispose メソッドをオーバーライドして、子ストリームが閉じないようにする
于 2009-10-27T21:10:23.330 に答える
2

ToArray を提案してくれた何人かのおかげで、私は正しい答えである `M.GetBuffer' にたどり着きました。ToArray はそれほど悪くはありませんが、

  • コピーを作成します
  • バッファの一部のみを取得します

GetBuffer は、基になる byte[] への参照を取得するだけです。これが私が求めているものです。

于 2009-10-27T21:21:09.483 に答える
1

ここに追加するだけで、非常に簡単な解決策はライターを Dispose() しないことです。

void R(MemoryStream M)
{
    B = new BinaryWriter(M);

    // write some stuff using B        
    B.Flush();
    S(M);  // now pass M to another routine for further processing
}

これで、B をスコープ内に保持することだけを心配する必要があります。これは、R() の間です。

これはここでの最善の解決策ではないかもしれませんが、Reader と Writer は自分自身を破棄する必要がないことに注意してください。

于 2009-10-27T21:42:52.473 に答える
0

やや単純なアプローチは、使用することです

byte buf[] = MemoryStream.ToArray();

ストリームの内容をバイト配列にコピーします。でストリームに戻すことができます

MemoryStream ms = new MemoryStream(buf);
于 2009-10-27T21:10:04.560 に答える
0

このM.Clone ();によると 動作するはずです。でも間違ってるかも…

于 2009-10-27T21:12:41.323 に答える