2009-11-17 10 views
28

मुझे सी # में धाराओं के बारे में बहुत कुछ पता नहीं है। अभी मेरे पास एक स्ट्रीम है जिसे मैंने स्ट्रीम रीडर में रखा है और इसे पढ़ा है। बाद में किसी अन्य विधि में मैं धारा (एक ही धारा वस्तु) पढ़ने की जरूरत है लेकिन इस बार मैं यह त्रुटिक्या मुझे शुरुआत में एक स्ट्रीम (सी #) रीसेट करने की आवश्यकता है?

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

जब आप समाप्त करने के लिए एक धारा पढ़ा है, विशेष रूप से 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

यह सिर्फ बंद करने की तुलना में एक बेहतर तरीका की तरह लग रहा है, और सही जवाब की तरह लग रहा है। +1 –

+0

क्या StreamReader की तलाश है? मुझे यह नहीं मिल रहा है। – chobo2

+1

नहीं; धारा करता है ऊपर दिए गए कोड में 'sr.Seek' को 'stream.Seek' में बदलें। –

25

आपका निष्कर्ष सही है; एक बार आप अपने सिस्टम के अंत तक पहुँच है, तो आप और अधिक डेटा को पढ़ने में सक्षम हैं जब तक आप स्ट्रीम के भीतर अपनी स्थिति को रीसेट कर दिया है नहीं होगा:

myStream.Position = 0; 

यह वापस शुरुआत करने की मांग के बराबर है। ध्यान दें कि आपकी स्ट्रीम को काम करने के लिए इसकी तलाश करना चाहिए; सभी धाराएं नहीं करते हैं। आप इसे CanSeek संपत्ति से देख सकते हैं। StreamReader के लिए

+0

वैसे मैं एक स्ट्रीम कैसे प्राप्त कर सकता हूं? जैसे कि मैं एक एफटीपी अनुरोध से "GetResponseStream()" को वापस करने की कोशिश कर रहा हूं और यह "स्ट्रीम" देता है, यह "तलाशने" का समर्थन नहीं करता है, तो मुझे क्या करना चाहिए? – chobo2

+0

क्या आप पूरी स्ट्रीम को एक बार में पढ़ सकते हैं? यदि ऐसा है, तो इसे बाइट सरणी में पढ़ें, फिर उस सरणी से एक नया मेमोरीस्ट्रीम (जो मांग का समर्थन करता है) बनाएं। –

+0

मैं इसे बाइट सरणी में कैसे पढ़ सकता हूं? जैसा कि बाइट सरणी बनाने के लिए बड़ा करने के लिए मुझे पहले स्ट्रीम के आकार को समझने की आवश्यकता नहीं होगी? – chobo2

4

उपयोग BaseStream:

StreamReader sr = new StreamReader(pFileStream); 
sr.BaseStream.Seek(0, SeekOrigin.Begin); 
संबंधित मुद्दे

 संबंधित मुद्दे