带有大文件的GZipStream不能正常工作

时间:2013-05-21 11:59:48

标签: c# compression gzip

我想压缩一些非常大的GML文件(1-10GB)。我为此编写了一个方法,但它不能很好地工作。如果我使用7-zip for Windows(或其他东西)解压缩它,我得到的文件看起来很糟糕(它还没有完成,XML还没有完成)......我看不到我在做什么错...

private void CompressFile()
{
    string outputPath = Path.Combine(Path.ChangeExtension(_gmlPath, ".gz"));

    var buffer = new byte[1024 * 64];
    using (var compressing = new GZipStream(File.OpenWrite(outputPath), CompressionMode.Compress))
    {
        using (var file = File.OpenRead(_gmlPath))
        {
            var bytesRead = file.Read(buffer, 0, buffer.Length);
            while (bytesRead != 0)
            {
                compressing.Write(buffer, 0, buffer.Length);
                bytesRead = file.Read(buffer, 0, buffer.Length);
            }
        }
    }
}

[编辑]

其他问题:如何指定/更改在GZ内压缩的文件名?它的名称与输入的名称相同,但没有.gml扩展名:S(输入中有)...

3 个答案:

答案 0 :(得分:8)

var bytesRead = file.Read(buffer, 0, buffer.Length);

读取1到65536个字节,但

compressing.Write(buffer, 0, buffer.Length);

总是写入65536个字节,因此如果读取的字节少于65536个字节,则最终会出现垃圾邮件。

解决方案:只写bytesRead个字节。

compressing.Write(buffer, 0, bytesRead);

答案 1 :(得分:3)

您只想写出当前迭代中读取的字节数,而不是整个缓冲区长度。

compressing.Write(buffer, 0, bytesRead);

答案 2 :(得分:0)

尝试使用SharpZipLib来实现该目标