2010-07-09 10 views
40

मेरे पास निम्न कन्स्ट्रक्टर विधि है जो फ़ाइल पथ से MemoryStream खोलती है:.NET में स्ट्रीम से मेमोरीस्ट्रीम कैसे प्राप्त करें?

MemoryStream _ms; 

public MyClass(string filePath) 
{ 
    byte[] docBytes = File.ReadAllBytes(filePath); 
    _ms = new MemoryStream(); 
    _ms.Write(docBytes, 0, docBytes.Length); 
} 

मुझे फ़ाइल पथ के बजाय Stream को स्वीकार करने के लिए इसे बदलने की आवश्यकता है। Xzx18 ऑब्जेक्ट से MemoryStream प्राप्त करने का सबसे आसान/सबसे प्रभावी तरीका क्या है?

+3

एक बार स्ट्रीम होने के बाद, इसे मेमोरीस्ट्रीम में परिवर्तित करने में परेशानी क्यों होती है? क्या आप सीधे स्ट्रीम के साथ काम नहीं कर सकते? –

+1

मुझे अन्य निर्भरताओं के कारण मेमोरीस्ट्रीम की आवश्यकता है। – fearofawhackplanet

उत्तर

18

यदि आप फ़ाइल नाम के बजाय स्ट्रीम स्वीकार करने के लिए अपनी कक्षा को संशोधित कर रहे हैं, तो मेमोरीस्ट्रीम में कनवर्ट करने से परेशान न हों। अंतर्निहित स्ट्रीम संचालन संभाल करते हैं:

public class MyClass 
{ 
    Stream _s; 

    public MyClass(Stream s) { _s = s; } 
} 

यदि आपको वास्तव में आंतरिक संचालन के लिए एक MemoryStream की जरूरत है, आप MemoryStream में स्रोत स्ट्रीम से बाहर डेटा की प्रतिलिपि करना होगा:

public MyClass(Stream stream) 
{ 
    _ms = new MemoryStream(); 
    CopyStream(stream, _ms); 
} 

// Merged From linked CopyStream below and Jon Skeet's ReadFully example 
public static void CopyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[16*1024]; 
    int read; 
    while((read = input.Read (buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write (buffer, 0, read); 
    } 
} 
+0

मुझे लगता है कि समय रेखा के अंत में '> 0' है? – fearofawhackplanet

+0

@fearofawhackplanet - सही। मुझे थोड़ा हटाना अच्छा लगा। फिक्स्ड। –

+3

ऐसा लगता है कि एक बंद कोष्ठक गायब है। होना चाहिए (जबकि पढ़ें = इनपुट। पढ़ें (बफर, 0, बफर। लम्बाई))> ​​0) ' –

2

How do I copy the contents of one stream to another?

कि देखते हैं। एक स्ट्रीम स्वीकार करें और स्मृति में प्रतिलिपि बनाएँ। आपको के लिए .Length का उपयोग नहीं करना चाहिए क्योंकि यह आवश्यक नहीं है कि प्रत्येक कंक्रीट स्ट्रीम में लागू किया जाए।

1
public static void Do(Stream in) 
{ 
    _ms = new MemoryStream(); 
    byte[] buffer = new byte[65536]; 
    while ((int read = input.Read(buffer, 0, buffer.Length))>=0) 
     _ms.Write (buffer, 0, read); 
} 
3

आपको स्ट्रीम ऑब्जेक्ट से सभी डेटा में byte[] बफर में पढ़ना होगा और फिर इसे MemoryStream में अपने कन्स्ट्रक्टर के माध्यम से पास करना होगा। आपके द्वारा उपयोग किए जा रहे स्ट्रीम ऑब्जेक्ट के प्रकार के बारे में अधिक विशिष्ट होना बेहतर हो सकता है। Stream बहुत सामान्य है और Length विशेषता लागू नहीं कर सकता है, जो डेटा में पढ़ने पर उपयोगी होता है।

यहां आपके लिए कुछ कोड है:

public MyClass(Stream inputStream) { 
    MemoryStream outputStream = new MemoryStream(); 

    byte[] inputBuffer = new byte[65535]; 
    int readAmount; 
    while((readAmount = inputStream.Read(inputBuffer, 0, inputBuffer.Length)) > 0) 
     outputStream.Write(inputBuffer, 0, readAmount); 

    _ms = outputStream; 
} 
1

मैं के इस संयोजन का उपयोग करें:

public MyClass(Stream inputStream) { 
    byte[] inputBuffer = new byte[inputStream.Length]; 
    inputStream.Read(inputBuffer, 0, inputBuffer.Length); 

    _ms = new MemoryStream(inputBuffer); 
} 

Stream वस्तु Length विशेषता को लागू नहीं करता है, तो आप कुछ इस तरह लागू करना होगा विस्तार विधियां:

public static Stream Copy(this Stream source) 
    { 
     if (source == null) 
      return null; 

     long originalPosition = -1; 

     if (source.CanSeek) 
      originalPosition = source.Position; 

     MemoryStream ms = new MemoryStream(); 

     try 
     { 
      Copy(source, ms); 

      if (originalPosition > -1) 
       ms.Seek(originalPosition, SeekOrigin.Begin); 
      else 
       ms.Seek(0, SeekOrigin.Begin); 

      return ms; 
     } 
     catch 
     { 
      ms.Dispose(); 
      throw; 
     } 
    } 

    public static void Copy(this Stream source, Stream target) 
    { 
     if (source == null) 
      throw new ArgumentNullException("source"); 
     if (target == null) 
      throw new ArgumentNullException("target"); 

     long originalSourcePosition = -1; 
     int count = 0; 
     byte[] buffer = new byte[0x1000]; 

     if (source.CanSeek) 
     { 
      originalSourcePosition = source.Position; 
      source.Seek(0, SeekOrigin.Begin); 
     } 

     while ((count = source.Read(buffer, 0, buffer.Length)) > 0) 
      target.Write(buffer, 0, count); 

     if (originalSourcePosition > -1) 
     { 
      source.Seek(originalSourcePosition, SeekOrigin.Begin); 
     } 
    } 
148

.NET 4 में, आप अन्य उत्तरों में सूचीबद्ध होम-ब्रू विधियों की बजाय स्ट्रीम की प्रतिलिपि बनाने के लिए Stream.CopyTo का उपयोग कर सकते हैं।

MemoryStream _ms; 

public MyClass(Stream sourceStream) 

    _ms = new MemoryStream(); 
    sourceStream.CopyTo(_ms); 
} 
0
byte[] fileData = null; 
using (var binaryReader = new BinaryReader(Request.Files[0].InputStream)) 
{ 
    fileData = binaryReader.ReadBytes(Request.Files[0].ContentLength); 
} 
18

इस का उपयोग करें:

var memoryStream = new MemoryStream(); 
stream.CopyTo(memoryStream); 

यह MemoryStream को Stream परिवर्तित कर देंगे।

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