GZipStream和DeflateStream会生成更大的文件

时间:2010-10-05 13:27:37

标签: c# 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();

5 个答案:

答案 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这样的文件压缩器可能会更好。