c# - 大文件的 GZipStream 不能正常工作

标签 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(输入中有)...

最佳答案

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

读取 1 到 65536 字节之间,但是

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

总是写入 65536 字节,因此如果您读取少于 65536 字节,您将在文件中得到垃圾。

解决方案:只写 bytesRead 很多字节。

compressing.Write(buffer, 0, bytesRead);

关于c# - 大文件的 GZipStream 不能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16669474/

相关文章:

ubuntu - 如何在 Linux 中提取 zip 文件并保留原始文件?

c# - 在 .NET 中创建 ZIP 存档的最佳/最简单方法是什么?

c# - 在不更改接口(interface)返回类型的情况下更改 WCF 中函数的返回类型

compression - 二进制数据的最佳压缩技术?

language-agnostic - 压缩二进制矩阵

c - http 服务器响应(套接字)的 header 和内容之间存在差异

PHP 将 GZ 文件解析为 XML

c# - 使用 C# 从 TCP 流中解析串联的、非定界的 XML 消息

c# - 转换枚举?到整数?使用反射时失败

javascript - "streamlining"Javascript 和 jQuery 的好提示和技巧