2010-08-09 12 views
9

मेरे पास निम्न विधि है और किसी कारण से कॉपी करने के लिए पहली कॉल कुछ भी नहीं लगता है? किसी को पता है क्यों? विधि में इनपुट में संपीड़ित है और बेस 64 उस विधि को आपूर्ति करने के लिए आपूर्ति कर सकता है।CopyTo स्ट्रीम करने के लिए मुझे दो कॉल की आवश्यकता क्यों है?

private byte[] GetFileChunk(string base64) 
    { 
     using (
      MemoryStream compressedData = new MemoryStream(Convert.FromBase64String(base64), false), 
      uncompressedData = new MemoryStream()) 
     { 

      using (GZipStream compressionStream = new GZipStream(compressedData, CompressionMode.Decompress)) 
      { 
       // first copy does nothing ?? second works 
       compressionStream.CopyTo(uncompressedData); 
       compressionStream.CopyTo(uncompressedData); 
      } 

      return uncompressedData.ToArray(); 
     } 
    } 

उत्तर

2

यदि पढ़ने के लिए पहली कॉल() 0 देता है तो Stream.CopyTo() या तो काम नहीं करेगा। हालांकि यह GZipStream के साथ किसी समस्या को इंगित करता है, यह बहुत असंभव है कि इसमें इस तरह की एक बग है। अधिक संभावना है कि जब आप संपीड़ित डेटा बनाते हैं तो कुछ गलत हो जाता है। पहले 0 बाइट्स को संपीड़ित करने की तरह, वास्तविक डेटा को संपीड़ित करके।

2

बस एक अनुमान है, लेकिन, क्योंकि नए GZipStream निर्माता सरणी के अंत में सूचकांक को छोड़ देता है, और पहली CopyTo फिर सेट करता है यह शुरू करने के लिए यह है ताकि जब आप दूसरे CopyTo इसकी अब में फोन शुरुआत और डेटा को सही ढंग से कॉपी करता है?

1

आप कितने निश्चित हैं कि पहली प्रतिलिपि कुछ भी नहीं करती है और दूसरा काम है, जो GZipStream कक्षा में एक बग होगा। आपका कोड दो बार CopyTo को कॉल किए बिना ठीक काम करना चाहिए।

+0

पहली प्रति स्ट्रीम स्ट्रीम नहीं करती है; रीड विधि के साथ समान व्यवहार प्राप्त करें। GZipStream एक माइक्रोसॉफ्ट क्लास है कि वहां कक्षा में कोई त्रुटि नहीं है? –

+0

हम्म आप 100% सुनिश्चित हैं। पढ़ना एक अलग बात है पूरी तरह से रीड विधि पर अनुबंध का कहना है कि अनुरोधित बाइट्स की मात्रा वापस करने की गारंटी नहीं है, लेकिन CopyTo दस्तावेज एक ही दावा नहीं करता है, लेकिन शायद यह आंतरिक रूप से रीड विधि का उपयोग करता है। क्या आपने स्ट्रीम पर उदाहरण के प्रति लूप एक्स में इसका उपयोग करने का प्रयास किया है। एमएसडीएन पेज पढ़ें http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx –

+0

हां एक लूप से शुरू हुआ , रिटर्न 0 पढ़ने के लिए पहली कॉल, अंत तक वापसी बाइट पढ़ने के लिए बाद में कॉल। –

0

हाय सभी के इनपुट के लिए धन्यवाद। यह पता चला कि त्रुटि एन्कोडिंग विधि में गलती के कारण हुई थी। विधि थी

/// <summary> 
    /// Compress file data and then base64s the compressed data for safe transportation in XML. 
    /// </summary> 
    /// <returns>Base64 string of file chunk</returns> 
    private string GetFileChunk() 
    { 
     // MemoryStream for compression output 
     using (MemoryStream compressed = new MemoryStream()) 
     { 
      using (GZipStream zip = new GZipStream(compressed, CompressionMode.Compress)) 
      { 

       // read chunk from file 
       byte[] plaintext = new byte[this.readSize]; 
       int read = this.file.Read(plaintext, 0, plaintext.Length); 

       // write chunk to compreesion 
       zip.Write(plaintext, 0, read); 
       plaintext = null; 

       // Base64 compressed data 
       return Convert.ToBase64String(compressed.ToArray()); 
      } 
     } 
    } 

वापसी की रेखा से नीचे संपीड़न धारा को बंद करने और फ्लश करने के लिए अनुमति का उपयोग कर, यह असंगत व्यवहार के कारण होता है जब धारा decompressing होना चाहिए।

 /// <summary> 
    /// Compress file data and then base64s the compressed data for safe transportation in XML. 
    /// </summary> 
    /// <returns>Base64 string of file chunk</returns> 
    private string GetFileChunk() 
    { 
     // MemoryStream for compression output 
     using (MemoryStream compressed = new MemoryStream()) 
     { 
      using (GZipStream zip = new GZipStream(compressed, CompressionMode.Compress)) 
      { 

       // read chunk from file 
       byte[] plaintext = new byte[this.readSize]; 
       int read = this.file.Read(plaintext, 0, plaintext.Length); 

       // write chunk to compreesion 
       zip.Write(plaintext, 0, read); 
       plaintext = null; 
      } 

      // Base64 compressed data 
      return Convert.ToBase64String(compressed.ToArray()); 
     } 
    } 

सभी की मदद के लिए धन्यवाद।

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