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

Nic*_*kon 2 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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

[编辑]

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

dtb*_*dtb 8

var bytesRead = file.Read(buffer, 0, buffer.Length);
Run Code Online (Sandbox Code Playgroud)

读取介于1和65536之间,但是

compressing.Write(buffer, 0, buffer.Length);
Run Code Online (Sandbox Code Playgroud)

总是写入65536个字节,所以如果读取的字节少于65536个字节,那么你最终会得到文件中的垃圾.

解决方案:只写入bytesRead许多字节.

compressing.Write(buffer, 0, bytesRead);
Run Code Online (Sandbox Code Playgroud)