当您使用GzipStream或DeflateStream来自System.IO.Compression命名空间时,Stream您在构造函数中提供的将被写入以进行压缩并从decompression中读取。
由于您尝试在此处压缩数据,因此使用MemoryStream是不正确的,因为您没有尝试对其进行压缩,而是将其用作数据源。因此,您MemoryStream应该是输入Stream,而应该FileStream是您的输出。
我强烈建议您使用MemoryStream作为原始数据源的数据源,byte[]因为Stream它具有更多的多功能性和应用程序(FileStream, NetworkStream,CryptoStream等)
以下是一些使用async/await模式的示例:
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();
// After writing to the MemoryStream, the position will be the size
// of the decompressed file, we should reset it back to zero before returning.
outputStream.Position = 0;
return outputStream;
}
}
注意:始终在关闭输入或输出GzipStream.Close()之前调用。它在关闭/处置时会进行一些最终的缓冲区刷新,如果输入或输出首先关闭,它会在尝试这样做时抛出异常。(这也适用于) StreamDeflateStream