9

我正在尝试在 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();
4

5 回答 5

7

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

于 2010-10-05T13:32:45.143 回答
2

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

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

因此,当您在 docx 上运行 deflate/gzip 时,它实际上会使文件变大。(这就像对具有高压缩级别的压缩文件执行低压缩级别的 zip。)

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

于 2010-10-05T13:39:25.690 回答
0

我在压缩包含 jpg 数据的数据库时遇到了同样的问题。我尝试了dotnetzip - 替换并获得了不错的压缩(也支持 Compact Framework!):

MS : 10MB -> 10.0MB
DNZ: 10MB ->  7.6MB
于 2011-10-11T14:53:39.373 回答
0

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

于 2010-10-05T14:21:30.177 回答
-2

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

于 2010-10-05T13:32:55.783 回答