it-swarm-ja.tech

stream(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: 

だから、おそらく最後まで流れるストリームを読むことで考えています。その後、もう一度読み込もうとすると、ストリームの最後にあるため、このエラーが発生します。

だから誰もこれにいくらか光を当てることができますか?

ありがとう

40
chobo2

特に 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
68
user153498

あなたの結論は正しいです。ストリームの最後に到達すると、ストリーム内の位置をリセットするまで、さらにデータを読み取ることができなくなります。

myStream.Position = 0;

これは、最初に戻ることと同等です。ストリームは、これが機能するためのシークをサポートする必要があることに注意してください。すべてのストリームがそうするわけではありません。これはCanSeekプロパティで確認できます。

32

BaseStreamにはStreamReaderを使用します。

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