2009-11-17 42 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); 
相關問題