読者です 読者をやめる 読者になる 読者になる

GZip(Deflate)Streamで圧縮するときはCloseを忘れなく

C#

狭いスコープでusingしておくのは大事だなと再認識。

書いたコード

byte[] original = File.ReadAllBytes(@"C:\Windows\explorer.exe");

var memory = new System.IO.MemoryStream();
var gzip = new System.IO.Compression.GZipStream(
    memory, System.IO.Compression.CompressionMode.Compress);

gzip.Write(original, 0, original.Length);

byte[] deflated = memory.ToArray();
Console.WriteLine(deflated.Length); // 1712138

それらしい結果ですが、壊れています。

正しいコード

byte[] original = File.ReadAllBytes(@"C:\Windows\explorer.exe");

var memory = new System.IO.MemoryStream();
var gzip = new System.IO.Compression.GZipStream(
    memory, System.IO.Compression.CompressionMode.Compress);

gzip.Write(original, 0, original.Length);
gzip.Dispose(); // !!!

byte[] deflated = memory.ToArray();
Console.WriteLine(deflated.Length); // 1727359

Lengthが変わりました。なお環境はWindows10 x64です。

Dispose (Close)せずにFlushでも同じ効果かと思いましたが、変化は見られませんでした。