当您使用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()
之前调用。它在关闭/处置时会进行一些最终的缓冲区刷新,如果输入或输出首先关闭,它会在尝试这样做时抛出异常。(这也适用于) Stream
DeflateStream