2012-03-01 36 views
27

私はmemoryStreamインスタンスを持っていて、それは閉じています。メモリストリームの閉じたストリームにアクセスできない、再オープンする方法は?

私はすでに試してみました:

memoryStream.Flush(); 
memoryStream.Position=0; 

メモリストリームを再度開くには、それは動作しません。クローズドメモリストリームを再オープンするにはどうしたらいいですか?

+1

を?または[MemoryStream.ToArray](http://msdn.microsoft.com/en-us/library/system.io.memorystream.toarray.aspx)を使用して、新しいストリームを作成します。 – dtb

+0

Devn;正式にストリームを終了した場合は、ストリームを再び開くことはできませんが、管理しているものとそのストリームを最初に閉じる必要がある理由を説明するのに役立ちます。最終的に、あなたのストリームで何を達成しようとしていますか? –

+1

@RussClarkeこれは、通常、あるサードパーティのライブラリがあなたのストリームを「有益に」閉じたからです。残念ながら、それは珍しいことではありません。 –

答えて

10

クローズドメモリストリームを再オープンするにはどうすればよいですか?

ストリームを再度開くことはできません。あなたは、ストリームを「リセット」する必要がある場合は、ちょうどそれに新しいインスタンスを割り当てる:

memoryStream = new MemoryStream(); 
+2

しかし、クローズドメモリストリームを再利用するにはどうすればよいですか? – olidev

+1

Reedが言ったように、あなたはできません。後で必要な場合は閉じないでください。閉じたという事実を変更できない場合は、新しいものを作成する必要があります。 –

+0

確かに、あなたの質問で示唆したように、ストリームを閉じるのではなく、おそらくFlushとPositionを使うことができますか? –

28

をあなたは、元が閉じられた場合でも、元のクローンを作成して、クローンを使用することができます。元のものが1000の容量で作成されたとしても、ToArray()は2要素の配列を返します。一方、ToBuffer()はバッファ全体を取得しますが、これはあなたが望まないものです。

MemoryStream original = new MemoryStream(1000); 
original.WriteByte(4); 
original.WriteByte(5); 

MemoryStream dolly = new MemoryStream(original.ToArray()); 
dolly.Seek(0, SeekOrigin.Begin); 
+1

クローンはバッファをコピーしますか?または、同じバッキングバイト[]をポイントするだけですか?閉じたMemoryStreamから長さを取得しようとしています。(愚かなAPIは**と**ストリームを閉じるのは良いと思います...) –

+0

バッファをコピーします。ここでToArray()を参照してください:http://referencesource.microsoft.com/#mscorlib/system/io/memorystream.cs,1a4dcb744a23ba6f –

9

この試してみてください。それを閉じないでください

memoryStream = new MemoryStream(memoryStream.ToArray()); 
関連する問題