3

我刚刚开始使用以下代码在 VB.Net 中压缩文件。由于我的目标是 Fx 2.0,因此我无法使用该Stream.CopyTo方法。

Normal但是,与7-zip 中的 gzip 压缩配置文件相比,我的代码给出了极差的结果。例如,我的代码将一个 630MB 的 Outlook 存档压缩到 740MB,而 7-zip 压缩到 490MB。

这是代码。是否有明显的错误(或很多?)

Using Input As New IO.FileStream(SourceFile, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read)
    Using outFile As IO.FileStream = IO.File.Create(DestFile)
        Using Compress As IO.Compression.GZipStream = New IO.Compression.GZipStream(outFile, IO.Compression.CompressionMode.Compress)
            'TODO: Figure out the right buffer size.'
            Dim Buffer(524228) As Byte
            Dim ReadBytes As Integer = 0

            While True
                ReadBytes = Input.Read(Buffer, 0, Buffer.Length)
                If ReadBytes <= 0 Then Exit While
                Compress.Write(Buffer, 0, ReadBytes)
            End While
        End Using
    End Using
End Using

我尝试了多种缓冲区大小,但我得到了相似的压缩时间,以及完全相同的压缩比。

4

3 回答 3

5

编辑,或实际重写:看起来 BCL 编码人员决定将称为.

System.dll2.0 版中的实现使用针对纯 ASCII 文本优化的静态定义、硬编码的 Huffman 树,而不是像其他实现那样自适应地生成 Huffman 树。它也不支持存储块优化(这是标准 GZip/Deflate 避免失控扩展的方式)。结果,除了纯文本之外,通过它们的实现运行任何类型的文件都会导致文件比输入大得多,微软声称这是设计使然!

节省一些痛苦,抓住第三方实施

于 2011-02-12T00:00:59.843 回答
1

IO.Compression 并不是真正为我们设计的。它是为支持 XPS 或 XML Paper Specificationatin 而创建的。目前,如果您想要体面的文件压缩,您必须使用第三方库。

于 2011-02-11T23:56:26.700 回答
0

一些可能有用的附加信息。我正在压缩一些静态文件(二进制文件)以包含在项目版本中,并且遇到了相同的问题,即文件大小随着 IO.Compression.GZipStream 的增加而增加。

我决定使用 Ionic.Zip 代替可以使用最佳压缩的地方。

我立即注意到的一件事是,即使 Ionic.Zip 将我的文件减少到原始大小的 25%,压缩操作也慢了大约 3-4 倍(完全预期),但解压缩过程也慢了 3 倍,这使得解压缩需要1.6 秒对比 0.5 秒。

由于 GZipStream 是一个标准,即使 .NET 中内置的 IO.Compression.GZipStream 压缩空间效率要低得多,但解压缩速度要快得多。

所以我使用Ionic.Zip库“ ZLib.GZipStream压缩文件和“ IO.Compression.GZipStream ”在生产中更快地解压缩文件。

于 2013-04-14T00:21:43.413 回答