Compress and decompress a Stream with Compression.DeflateStream

.net, c#, compression, stream

Solution

Fix your `Compress` function:

private static byte[] Compress(Stream input)
{
    using(var compressStream = new MemoryStream())
    using(var compressor = new DeflateStream(compressStream, CompressionMode.Compress))
    {
        input.CopyTo(compressor);
        compressor.Close();
        return compressStream.ToArray();
    }
}

compressed stream was not flushed before returning the resulting byte array.

Problem

I am trying to compress and decompress a Stream using Compression.DeflateStream. Compressing seems to work correctly since the code below compresses my Stream to a 110 bytes long array. However, reading the decompressed Stream results in an empty string. ``` class Program { static void Main(string[] args) { // Compress a random string value string value = Path.GetRandomFileName(); byte[] compressedBytes; using (var writer = new StreamWriter(new MemoryStream())) { writer.Write(value); writer.Flush(); writer.BaseStream.Position = 0; compressedBytes = Compress(writer.BaseStream); } // Decompress compressed bytes Stream decompressedStream = Decompress(compressedBytes); // here already applies: decompressedStream.Length == 0 using (var reader = new StreamReader(decompressedStream)) { string decompressedValue = reader.ReadToEnd(); if (value == decompressedValue) Console.WriteLine("Success"); else Console.WriteLine("Failed"); } } private static byte[] Compress(Stream input) { using (var compressStream = new MemoryStream()) using (var compressor = new DeflateStream(compressStream, CompressionMode.Compress)) { input.CopyTo(compressor); return compressStream.ToArray(); } } private static Stream Decompress(byte[] input) { var output = new MemoryStream(); using (var compressStream = new MemoryStream(input)) using (var decompressor = new DeflateStream(compressStream, CompressionMode.Decompress)) decompressor.CopyTo(output); output.Position = 0; return output; } } ``` Can anyone help me on this one? Many thanks.

Original source