2009-11-17 23 views
28

Tôi không biết nhiều về luồng trong C#. Ngay bây giờ tôi có một luồng mà tôi đưa vào một trình đọc luồng và đọc nó. Sau đó trong một số phương pháp khác tôi cần phải đọc các dòng (cùng một đối tượng dòng) nhưng lần này tôi nhận được lỗi nàyTôi có cần đặt lại luồng (C#) về đầu không?

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: 

Vì vậy, tôi nghĩ có thể bằng cách đọc dòng nó đi đến cùng. Sau đó, khi tôi cố gắng đọc nó một lần nữa nó là ở phần cuối của dòng và đó là lý do tại sao tôi nhận được lỗi này.

Vì vậy, bất kỳ ai cũng có thể làm sáng tỏ điều này?

Cảm ơn

Trả lời

54

Khi bạn đọc một dòng suối để cuối cùng, đặc biệt với phương pháp ReadToEndStreamReader 's, bạn phải Seek nó trở lại bắt đầu. Điều này có thể được thực hiện như vậy:

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

này trông giống như một phương pháp tốt hơn hơn là chỉ đóng nó, và trông giống như câu trả lời đúng. +1 –

+0

StreamReader có tìm kiếm không? Tôi không thể tìm thấy nó. – chobo2

+1

Không; luồng. Thay đổi 'sr.Seek' thành' stream.Seek' trong đoạn mã trên. –

25

Kết luận của bạn là chính xác; khi bạn đã kết thúc luồng của mình, bạn sẽ không thể đọc thêm dữ liệu cho đến khi bạn đặt lại vị trí của mình trong luồng:

myStream.Position = 0; 

Điều này tương đương với việc tìm kiếm lại từ đầu. Lưu ý rằng luồng của bạn phải hỗ trợ tìm kiếm điều này để hoạt động; không phải tất cả các luồng đều làm. Bạn có thể kiểm tra điều này với thuộc tính CanSeek.

+0

Làm cách nào tôi có thể nhận luồng? Giống như tôi đang cố gắng để "GetResponseStream()" trở lại từ một yêu cầu ftp và điều này trả về một "Stream" này không hỗ trợ "Tìm kiếm" vì vậy tôi nên làm gì? – chobo2

+0

Bạn có thể đọc toàn bộ luồng trong một lần không? Nếu vậy, hãy đọc nó thành một mảng byte, sau đó tạo một MemoryStream mới (hỗ trợ tìm kiếm) từ mảng đó. –

+0

Làm thế nào tôi có thể đọc nó thành một mảng byte? Giống như tôi sẽ không cần phải tìm ra kích thước của dòng đầu tiên để biết làm thế nào để lớn để làm cho mảng byte? – chobo2

4

Sử dụng BaseStream cho StreamReader:

StreamReader sr = new StreamReader(pFileStream); 
sr.BaseStream.Seek(0, SeekOrigin.Begin); 
Các vấn đề liên quan