When you use GzipStream or DeflateStream from the System.IO.Compression namespace, the Stream that you specify in the constructor will be written to for compression and read in decompression .
Since you are trying to compress data here, using a MemoryStream is wrong, because you are not trying to compress it, but rather use it as a data source. So your MemoryStream should be Stream input, and FileStream should be your output.
I highly recommend using a MemoryStream as a data source over raw byte[] , because Stream has much more versatility and application ( FileStream , NetworkStream , CryptoStream , etc.)
Here are some examples using the async / await pattern:
public static async Task CompressToFileAsync(byte[] buffer, string outputFile) { using (var inputStream = new MemoryStream(buffer)) await CompressToFileAsync(inputStream, outputFile); } public static async Task CompressToFileAsync(Stream inputStream, string outputFile) { using (var outputStream = File.Create(outputFile)) using (var gzip = new GZipStream(outputStream, CompressionMode.Compress)) { await inputStream.CopyToAsync(gzip); gzip.Close(); } } public static async Task<MemoryStream> DecompressFromFileAsync(string inputFile) { var outputStream = new MemoryStream(); using (var inputStream = File.Open(inputFile, FileMode.Open, FileAccess.Read, FileShare.Read)) using (var gzip = new GZipStream(inputStream, CompressionMode.Decompress)) { await gzip.CopyToAsync(outputStream); gzip.Close(); inputStream.Close();
NOTE. Always call GzipStream.Close() before closing the Stream input or output. It does some final flushing of the buffer on close / delete, and if the input or output is closed, it throws an exception when it tries to do this. (This also applies to DeflateStream )
Erik
source share