GzipStream
または名前空間DeflateStream
から使用すると、コンストラクターで指定したものが圧縮用に書き込まれ、decompressionから読み取られます。System.IO.Compression
Stream
ここでデータを圧縮しようとしているので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