2009-11-17 21 views
28

No sé demasiado sobre las transmisiones en C#. Ahora mismo tengo un flujo que pongo en un lector de flujo y lo leo. Más tarde, en algún otro método que necesito para leer la secuencia (el mismo objeto de secuencia), pero esta vez me sale este error¿Debo reiniciar una secuencia (C#) al inicio?

System.ArgumentException was unhandled by user code 
    Message="Stream was not readable." 
    Source="mscorlib" 
    StackTrace: 
     at System.IO.StreamReader..ctor(Stream stream, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize) 
     at System.IO.StreamReader..ctor(Stream stream) 
     at ExtractTitle(Stream file) in :line 33 
     at GrabWebPage(String webPath) in :line 62 
     at lambda_method(ExecutionScope , ControllerBase , Object[]) 
     at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
     at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7() 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) 
    InnerException: 

así que estoy pensando que tal vez mediante la lectura de la corriente que va al final. Luego, cuando intento leerlo nuevamente, está al final de la transmisión y es por eso que recibo este error.

Entonces, ¿alguien puede arrojar algo de luz sobre esto?

Gracias

Respuesta

54

Cuando se lee una corriente hasta el final, específicamente con ReadToEnd método StreamReader 's, que tienen que Seek de nuevo al principio. Esto se puede hacer así:

StreamReader sr = new StreamReader(stream); 
sr.ReadToEnd(); 
stream.Seek(0, SeekOrigin.Begin); //StreamReader doesn't have the Seek method, stream does. 
sr.ReadToEnd(); // This now works 
+2

Esto se ve como un método mejor que sólo cerrarla, y se parece a la respuesta correcta. +1 –

+0

¿StreamReader ha buscado? No puedo encontrarlo – chobo2

+1

No; la corriente lo hace. Cambie 'sr.Seek' a' stream.Seek' en el código anterior. –

25

Su conclusión es correcta; una vez que haya llegado al final de su flujo, usted no será capaz de leer más datos hasta que haya restablecer su posición dentro de la corriente:

myStream.Position = 0; 

Esto es equivalente a la búsqueda de nuevo al principio. Tenga en cuenta que su transmisión debe permitir que esto funcione; no todas las transmisiones lo hacen Puede verificar esto con la propiedad CanSeek.

+0

Bueno, ¿cómo puedo obtener una transmisión que sí lo haga? Al igual que estoy tratando de obtener "GetResponseStream()" de una solicitud ftp y esto devuelve un "Flujo", esto no admite "Buscar", entonces, ¿qué debo hacer? – chobo2

+0

¿Puedes leer toda la transmisión de una vez? Si es así, léala en una matriz de bytes y luego cree una nueva MemoryStream (que admita búsqueda) de esa matriz. –

+0

¿Cómo puedo leerlo en una matriz de bytes? Al igual que no voy a tener que averiguar el tamaño de la secuencia primero para saber cómo hacer la matriz de bytes? – chobo2

4

Uso BaseStream para StreamReader:

StreamReader sr = new StreamReader(pFileStream); 
sr.BaseStream.Seek(0, SeekOrigin.Begin); 
Cuestiones relacionadas