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.