2017-05-12 4 views
0

Kann jemand helfen zu verstehen, was im unteren Code falsch ist? Wie ich zeige, versuche ich nur einen Speicher-Stream zu komprimieren und zu dekomprimieren.Probleme beim Komprimieren/Dekomprimieren mit GZipStream C#

 //read 
      var memStream = new MemoryStream();    
      using (Stream fs = File.Open(@"..\..\..\TextFile.txt", FileMode.Open)) { 
       var byteArray = new byte[1 * 1024]; 
       int len = 0; 

       while ((len = fs.Read(byteArray, 0, byteArray.Length)) > 0) { 
        memStream.Write(byteArray, 0, len); 
       } 
      } 
      Console.WriteLine("read bytes {0}",memStream.Length); 

      //compress 
      byte[] compBytes; 
      using (var memStream2 = new MemoryStream()) { 
       memStream2.Position = 0; 
       using (var zipStream = new GZipStream(memStream2, CompressionMode.Compress)) { 
        memStream.Position = 0; 
        memStream.CopyTo(zipStream);      
        compBytes = memStream2.ToArray(); 
       } 

      } 
      Console.WriteLine("compressed bytes {0}", compBytes.Length); 

      //decompress 
      byte[] decompBytes; 
      using (var memStream3 = new MemoryStream(compBytes)) { 
       memStream3.Seek(0, SeekOrigin.Begin); 
       using (var memStream4 = new MemoryStream()) { 
        using (var zipStream = new GZipStream(memStream3, CompressionMode.Decompress)) { 

         zipStream.CopyTo(memStream4); 
         decompBytes = memStream4.ToArray(); 
        } 

       } 
      } 
      Console.WriteLine("decompressed bytes {0}", decompBytes.Length); 

Ausgang:

gelesenen Bytes 6034

komprimierte Bytes 10

dekomprimiert Bytes 0

+0

Sie Ihren Code ein wenig vereinfachen : Anstatt die Datei in Chunks zu lesen, verwenden Sie einfach fs.CopyTo (memStream); Darüber hinaus müssen Sie nach dem Erstellen eines neuen MemoryStream nicht zum Anfang des Streams suchen. – EFrank

Antwort

2

Sie MussFlush die GZipStream oder Dispose es, bevor Sie das Ziel lesen MemoryStream .

Versuchen Sie folgendes:

//compress 
byte[] compBytes; 
using (var memStream2 = new MemoryStream()) { 
    memStream2.Position = 0; 
    using (var zipStream = new GZipStream(memStream2, CompressionMode.Compress)) { 
     memStream.Position = 0; 
     memStream.CopyTo(zipStream); 

    } 
    compBytes = memStream2.ToArray(); <--- move it out of the zipstream using to flush it. 

} 
Console.WriteLine("compressed bytes {0}", compBytes.Length); 

Zip arbeitet mit Blöcken und puffert die Eingabe. Durch das Disposing/Flush wird der Zipstream gezwungen, einen kleineren Block zu schreiben.

1

Kannst du nicht schaffen nur 2 Funktion, die komprimiert und dekomprimiert:

public static byte[] Compress(byte[] data) 
{ 
    MemoryStream output = new MemoryStream(); 
    using (DeflateStream dstream = new DeflateStream(output, CompressionLevel.Optimal)) 
    { 
     dstream.Write(data, 0, data.Length); 
    } 
    return output.ToArray(); 
} 

public static byte[] Decompress(byte[] data) 
{ 
    MemoryStream input = new MemoryStream(data); 
    MemoryStream output = new MemoryStream(); 
    using (DeflateStream dstream = new DeflateStream(input, CompressionMode.Decompress)) 
    { 
     dstream.CopyTo(output); 
    } 
    return output.ToArray(); 
} 

Wenn Sie wollen, dass diese eine Textdatei verwenden komprimieren und dekomprimieren: kann

string file = File.ReadAllText("TEXT FILE LOCATION HERE"); 
      byte[] compressed = Compress(Encoding.ASCII.GetBytes(file)); 
      byte[] decompressed = Decompress(compressed);