IO.Compression有问题吗?

时间:2011-02-11 23:45:30

标签: .net vb.net compression gzip gzipstream

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

但是,与7-zip中的gzip Normal压缩配置文件相比,我的代码的结果非常差。例如,我的代码将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

我尝试过使用多种缓冲区大小,但是我获得了类似的压缩时间和完全相同的压缩率。

3 个答案:

答案 0 :(得分:5)

编辑,或实际重写:看起来BCL程序员决定phone it in

System.dll版本2.0中的实现使用针对纯ASCII文本优化的statically defined, hardcoded Huffman trees,而不是像其他实现那样自适应地生成霍夫曼树。它也不支持存储块优化(这是标准GZip / Deflate避免失控扩展的方式)。因此,通过除纯文本以外的实现运行任何类型的文件将导致比输入文件大得多的文件,并且Microsoft claims this is by design!

为自己省一些痛苦,抓住third party implementation

答案 1 :(得分:1)

IO.Compression并不是真的为我们做的。它创建了对XPS或XML Paper Specificatin的支持。目前,如果你想要适当的文件压缩,你必须使用第三方库。

答案 2 :(得分:0)

可能有用的一些其他信息。 我正在压缩一些静态文件(二进制)以包含在项目发布中,并且存在与IO.Compression.GZipStream文件大小增加相同的问题。

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

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

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

所以我使用两者 Ionic.Zip Librarys“ ZLib.GZipStream ”来压缩文件和“ IO.Compression。 GZipStream “以解压缩文件的速度更快。