我正在尝试在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();
答案 0 :(得分:7)
这么大的差异对我来说似乎很奇怪,但是你应该记住docx
本身是用ZIP压缩的,所以没有理由再次压缩它,结果通常会更大。
答案 1 :(得分:2)
首先,与zip,7z等相比,deflate / gzip流在压缩方面非常糟糕。
其次,docx(以及最后带有'x'的所有MS文档格式)无论如何都只是.zip文件。将.docx重命名为.zip以显示烟雾和镜子。
因此,当您在docx上运行deflate / gzip时,它实际上会使文件更大。 (它就像在压缩程度较高的拉链文件上进行压缩程度较低的压缩。)
但是,如果你对HTML或文本文件或未压缩的东西运行deflate / gzip,那么它实际上会做得很好。
答案 2 :(得分:0)
尽管正如其他人所指出的那样,您指定的示例文件已经被压缩了 - 但最大的问题是要理解与大多数压缩实用程序不同的是, DeflateStream 和 GZipStream < / em>类只是尝试对数据流进行标记化/压缩,而没有所有额外令牌(开销)实际上增加所需数据量的智能。 Zip,7z等足够聪明,知道如果数据主要是随机熵(几乎不可压缩),它们只是“按原样”存储数据(存储,而不是压缩),而不是试图进一步压缩数据。 / p>
答案 3 :(得分:0)
我在压缩包含jpg数据的数据库方面遇到了同样的问题。我尝试了dotnetzip - 一个替代品,并获得了不错的压缩(支持Compact Framework!):
MS : 10MB -> 10.0MB
DNZ: 10MB -> 7.6MB
答案 4 :(得分:-2)
我不认为GzipStream和DeflateStream是用来压缩文件的。使用像SharpZipLib这样的文件压缩器可能会更好。