2012-05-18 5 views
24

के बीच अंतर मेरे पास एक HttpHandler Response.OutputStream के माध्यम से एक छवि लौटा रहा है। मैं निम्नलिखित कोड है:Stream.CopyTo और MemoryStream.WriteTo

_imageProvider.GetImage().CopyTo(context.Response.OutputStream); 

GetImage() विधि एक Stream रिटर्न जो वास्तव में एक MemoryStream उदाहरण है और यह ब्राउज़र को 0 बाइट्स लौटा रहा है। अगर मैं GetImage() विधि हस्ताक्षर बदलने के एक MemoryStream लौट सकते हैं और कोड की निम्न पंक्ति का उपयोग करें:

_imageProvider.GetImage().WriteTo(context.Response.OutputStream); 

यह काम करता है और ब्राउज़र एक छवि हो जाता है। तो मेमोरीस्ट्रीम क्लास में WriteTo और CopyTo के बीच क्या अंतर है, और विधि हस्ताक्षर में Stream कक्षा का उपयोग करके यह कार्य करने का अनुशंसित तरीका क्या है।

उत्तर

38

WriteTo() डेटा की प्रतिलिपि बनाने से पहले पढ़ने की स्थिति को शून्य पर रीसेट कर रहा है - CopyTo() दूसरी ओर धारा में वर्तमान स्थिति के बाद जो भी डेटा बना रहता है उसकी प्रतिलिपि बनायेगा। इसका मतलब है कि अगर आपने स्थिति को रीसेट नहीं किया है, तो कोई भी डेटा बिल्कुल पढ़ा नहीं जाएगा।

सबसे अधिक संभावना आप बस अपने पहले संस्करण में निम्नलिखित याद आती है:

memoryStream.Position = 0; 
+1

मुझे लगता है कि कॉपीटो स्रोत को रखते हुए स्रोत रख रहा है। –

+5

आपको वह जानकारी कहाँ मिली? क्या आप लिंक की आपूर्ति कर सकते हैं? –

+0

मेरी इच्छा है कि मस्तिष्क के न्यूरॉन के पास सार्वजनिक पहुंच योग्य लिंक हो। – viento

9

परावर्तक के अनुसार, इस CopyTo() विधि परिभाषा है:

private void InternalCopyTo(Stream destination, int bufferSize) 
{ 
    int num; 
    byte[] buffer = new byte[bufferSize]; 
    while ((num = this.Read(buffer, 0, buffer.Length)) != 0) 
    { 
     destination.Write(buffer, 0, num); 
    } 
} 

मैं देख रहा हूँ न किसी भी "तंत्र बना हुआ है "यहां ... यह this से गंतव्य (बफर आकार के ब्लॉक में) से सब कुछ कॉपी करता है।

+0

@nonnb प्रिंट स्क्रीन? दस्तावेज? –

+0

माफ़ी, कृपया मेरी टिप्पणी को अनदेखा करें - मेरी गलती - मैं 2 फाइलस्ट्रीम के बीच प्रतिलिपि बना रहा था और CopyTo को कॉल करने से पहले स्ट्रीम में से किसी एक को रिवाइंड करना भूल गया था। CopyTo आपके जैसा काम करता है + ब्रोकन ग्लास ने – StuartLC

+4

का वर्णन किया है बस पेज को सुसंगत रखने के लिए: _IternalCopyTo_ विधि ने वर्तमान स्ट्रीम से बफर में _Reads_ वर्णित किया है - स्ट्रीम की वर्तमान स्थिति से पढ़ना शुरू होता है (इंडेक्स और ऑफसेट पैरामीटर बफर में इंडेक्स और ऑफ़सेट होते हैं) - वह "अवशेष तंत्र" है –

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