Подтвердить что ты не робот

Нужно ли мне reset поток (С#) вернуться к началу?

Я не слишком много знаю о потоках в С#. Прямо сейчас у меня есть поток, который я ввел в считыватель потока и прочитал его. Позже в другом методе мне нужно прочитать поток (тот же объект потока), но на этот раз я получаю эту ошибку

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: 

Поэтому я думаю, что, читая поток, он доходит до конца. Затем, когда я пытаюсь прочитать его снова, он находится в конце потока, и поэтому я получаю эту ошибку.

Так может ли кто-нибудь пролить свет на это?

Спасибо

4b9b3361

Ответ 1

Когда вы читаете поток до конца, в частности, StreamReader ReadToEnd, вы должны 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

Ваше заключение верно; как только вы достигнете конца вашего потока, вы не сможете читать больше данных, пока не найдете reset свою позицию в потоке:

myStream.Position = 0;

Это эквивалентно поиску начала. Обратите внимание, что ваш поток должен поддерживать поиск этого для работы; не все потоки. Вы можете проверить это с помощью свойства CanSeek.

Ответ 3

Используйте BaseStream для StreamReader:

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