2

我想压缩一些非常大的GML文件(1-10GB)。我为此编写了一个方法,但效果不佳。如果我使用 Windows 的 7-zip (或其他)解压缩它,我得到的文件最终看起来很糟糕(它没有完成,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(输入中有)...

4

3 回答 3

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);
于 2013-05-21T12:01:42.990 回答
3

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

compressing.Write(buffer, 0, bytesRead);
于 2013-05-21T12:02:14.723 回答
0

尝试使用SharpZipLib来实现该目标

于 2013-05-21T12:02:51.650 回答