2012-10-23 11 views
11

क्या गंतव्य स्ट्रीम में केवल कुछ बाइट्स की प्रतिलिपि बनाने के लिए Stream.CopyTo का उपयोग करने का कोई तरीका है? सबसे अच्छा कामकाज क्या है?केवल कुछ निश्चित बाइट्स की प्रतिलिपि बनाने के लिए Stream.CopyTo का उपयोग करने का कोई तरीका?

संपादित करें:
मेरे वैकल्पिक हल (कुछ कोड छोड़े गए):

internal sealed class Substream : Stream 
    { 
     private readonly Stream stream; 
     private readonly long origin; 
     private readonly long length; 
     private long position;   

     public Substream(Stream stream, long length) 
     { 
      this.stream = stream; 
      this.origin = stream.Position; 
      this.position = stream.Position; 
      this.length = length;    
     } 

public override int Read(byte[] buffer, int offset, int count) 
     { 
      var n = Math.Max(Math.Min(count, origin + length - position), 0);     
      int bytesRead = stream.Read(buffer, offset, (int) n); 
      position += bytesRead; 
      return bytesRead;    
     } 
} 

तो कॉपी करने के लिए n बाइट्स:

var substream = new Substream(stream, n); 
       substream.CopyTo(stm); 
+4

बाइट्स की संख्या पढ़ें और उन्हें गंतव्य स्ट्रीम में लिखें? – carlosfigueira

उत्तर

10

copying streams के कार्यान्वयन ज्यादा जटिल नहीं है। आप बाइट्स की केवल एक निश्चित संख्या में कॉपी करने के लिए अनुकूल बन सके तो यह मौजूदा विधि, इस

public static void CopyStream(Stream input, Stream output, int bytes) 
{ 
    byte[] buffer = new byte[32768]; 
    int read; 
    while (bytes > 0 && 
      (read = input.Read(buffer, 0, Math.Min(buffer.Length, bytes))) > 0) 
    { 
     output.Write(buffer, 0, read); 
     bytes -= read; 
    } 
} 

bytes > 0 के लिए चेक शायद सख्ती से आवश्यक नहीं है की तरह कुछ बदलाव करने के लिए भी मुश्किल नहीं होना चाहिए, लेकिन कोई नुकसान नहीं कर सकता

+1

4 जीबी से ऊपर की धाराओं के समर्थन के लिए, आपको केवल int पैरामीटर को लंबे पैरामीटर में बदलना चाहिए, फिर इसे Math.in फ़ंक्शन में int में डालें। –

4

क्या सिर्फ बाइट्स को कॉपी आप एक बफर का उपयोग कर की जरूरत के साथ गलत क्या है?

long CopyBytes(long bytesRequired, Stream inStream, Stream outStream) 
{ 
    long readSoFar = 0L; 
    var buffer = new byte[64*1024]; 
    do 
    { 
     var toRead = Math.Min(bytesRequired - readSoFar, buffer.Length); 
     var readNow = inStream.Read(buffer, 0, (int)toRead); 
     if (readNow == 0) 
      break; // End of stream 
     outStream.Write(buffer, 0, readNow); 
     readSoFar += readNow; 
    } while (readSoFar < bytesRequired); 
    return readSoFar; 
} 
+0

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

+0

मुझे लगता है कि मैं अपना कार्यान्वयन पसंद करता हूं लेकिन मैंने अभी भी इसे एकजुट किया है क्योंकि यह अनिवार्य रूप से वही काम करता है :) – Justin

+0

जस्टिन - आपका कार्यान्वयन अच्छा है, मुझे ब्रेक के साथ दूर करने की इच्छा है, भले ही यह अतिरिक्त तुलना में अतिरिक्त हो शुरुआत (पैडेंटिक मुझे पता है)। मुझे मेरा पसंद है क्योंकि यह कॉपी किए गए बाइट्स की कुल संख्या का ट्रैक रखता है जो महत्वपूर्ण हो सकता है यदि वे बाइट्स के समान नहीं हैं। बस अपने कार्य में 'बाइट्स' को पूरा करने के लिए 'लंबे' प्रकार में बदलें। उपरोक्त :) –

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

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