2009-11-17 43 views
28

我不太了解C#中的流。现在我有一个流,我把它放入流读者并阅读它。后来在一些其他的方法,我需要读取流(同流对象),但这个时候,我得到这个错误我是否需要将流(C#)重置为开始?

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: 

所以,我通过阅读它去年底流想也许。然后,当我尝试再次阅读它是在流的末尾,这就是为什么我得到这个错误。

那么谁能对此有所了解?

感谢

回答

54

当你读到流的结束,特别是与StreamReaderReadToEnd方法,你必须Seek它回到起点。这可以这样做:

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

这看起来不只是关闭它一个更好的方法,貌似正确的答案。 +1 –

+0

StreamReader有搜索吗?我找不到它。 – chobo2

+1

否;流确实。在上面的代码中将'sr.Seek'更改为'stream.Seek'。 –

25

您的结论是正确的;一旦你达到了你流的末尾,你将无法读取更多的数据,直到你流中重置您的位置:

myStream.Position = 0; 

这相当于寻求回到开头。请注意,您的信息流必须支持寻求此功能;并非所有的流都可以。您可以使用CanSeek属性进行检查。

+0

那么我怎样才能得到一个流呢?就像我想从一个ftp请求返回“GetResponseStream()”并返回一个“Stream”,这不支持“Seeking”,那么我该怎么办? – chobo2

+0

你能一口气读完整个流吗?如果是这样,请将其读入一个字节数组,然后从该数组创建一个新的MemoryStream(支持查找)。 –

+0

如何将它读入字节数组?就像我不需要首先知道流的大小来知道如何创建字节数组? – chobo2

4

使用BaseStreamStreamReader

StreamReader sr = new StreamReader(pFileStream); 
sr.BaseStream.Seek(0, SeekOrigin.Begin); 
相关问题