GZipStream和DeflateStream生成更大的文件

我正在尝试在C#中使用deflate / gzip流,但看起来压缩后的文件比以前更大。

例如,我压缩一个900ko的docx文件,但它产生一个1.4Mo!

它适用于我尝试的每个文件。

我做错的方式可能是我错了吗? 这是我的代码:

FileStream input = File.OpenRead(Environment.CurrentDirectory + "/file.docx"); FileStream output = File.OpenWrite(Environment.CurrentDirectory + "/compressedfile.dat"); GZipStream comp = new GZipStream(output, CompressionMode.Compress); while (input.Position != input.Length) comp.WriteByte((byte)input.ReadByte()); input.Close(); comp.Close(); // automatically call flush at closing output.Close(); 

这么大的差异对我来说似乎很奇怪,但你应该记住, docx本身是用ZIP压缩的,所以没有理由再次压缩它,结果通常更大。

首先,与zip,7z等相比,deflate / gzip流在压缩方面非常糟糕。

其次,docx(以及最后带有’x’的所有MS文档格式)无论如何都只是.zip文件。 将.docx重命名为.zip以显示烟雾和镜像。

因此,当您在docx上运行deflate / gzip时,它实际上会使文件更大。 (它就像在压缩程度较高的压缩文件上进行低压缩的压缩。)

但是,如果您对HTML或文本文件或未压缩的东西运行deflate / gzip,那么它实际上会做得非常好。

虽然正如其他人所指出的那样,你指定的示例文件已经被压缩了 – 最大的问题是要理解,与大多数压缩实用程序不同, DeflateStreamGZipStream类只是尝试标记/压缩数据流而没有智能所有额外的令牌(开销)实际上增加了所需的数据量。 Zip,7z等足够聪明,知道如果数据主要是随机熵(几乎不可压缩),它们只是“按原样”存储数据(存储,而不是压缩),而不是试图进一步压缩数据。

压缩包含jpg数据的数据库时遇到了同样的问题。 我尝试过dotnetzip – 一个替代品,并获得了不错的压缩(支持Compact Framework!):

 MS : 10MB -> 10.0MB DNZ: 10MB -> 7.6MB 

我不认为GzipStream和DeflateStream旨在压缩文件。 你可能会更喜欢像SharpZipLib这样的文件压缩器。