2012-03-01 19 views
27

Tengo una instancia de memoryStream y está cerrada.No se puede acceder a un flujo cerrado de un memoryStream, ¿cómo volver a abrir?

Ya he probado:

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

para reabrir la secuencia de memoria, pero no funciona. ¿Cómo puedo volver a abrir una secuencia de memoria cerrada?

+1

no lo cierre? O use [MemoryStream.ToArray] (http://msdn.microsoft.com/en-us/library/system.io.memorystream.toarray.aspx) y cree una nueva secuencia. – dtb

+0

Devn; Si cerró formalmente la transmisión, no puede volver a abrirla, pero tal vez podría ayudar a explicar qué es lo que está gestionando y por qué es necesario cerrar la transmisión en primer lugar. En definitiva, ¿qué intenta lograr con sus transmisiones? –

+1

@RussClarke Generalmente, se debe a que una biblioteca de terceros "de manera útil" cerró la transmisión por usted. No es raro, desafortunadamente. –

Respuesta

10

¿Cómo puedo volver a abrir una secuencia de memoria cerrada?

No puede volver a abrir la transmisión. Si es necesario "restablecer" la corriente, simplemente asignarle una nueva instancia:

memoryStream = new MemoryStream(); 
+2

, pero ¿cómo puedo reutilizar una secuencia de memoria cerrada? – olidev

+1

Como dijo Reed, no puedes. No lo cierre si lo necesita más tarde. Si no puede cambiar el hecho de que estaba cerrado, tendrá que crear uno nuevo. –

+0

De hecho, pero como insinuó en su pregunta, ¿podría usar Flush and Position, en lugar de cerrar la transmisión? –

28

Puede clonar el original y luego utilizar el clon, incluso cuando el original se ha cerrado. Aunque el original se creó con una capacidad de 1000, ToArray() devuelve un conjunto de 2 elementos. ToBuffer(), por otro lado, te ofrece todo el búfer, que es lo que no quieres.

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

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

¿El clon copia el búfer? ¿O simplemente apunta al mismo byte de respaldo []? Estoy tratando de obtener .Length de un MemoryStream cerrado (las API estúpidas piensan que es bueno escribir ** y ** cerrar una transmisión ...) –

+0

Copia el búfer. Consulte ToArray() aquí: http://referencesource.microsoft.com/#mscorlib/system/io/memorystream.cs,1a4dcb744a23ba6f –

9

probar esto:

memoryStream = new MemoryStream(memoryStream.ToArray()); 
Cuestiones relacionadas