C# 带有大文件的GZipStream不';工作不好

C# 带有大文件的GZipStream不';工作不好,c#,compression,gzip,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 by

我想压缩一些非常大的
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(输入中有)

读取1到65536字节,但

compressing.Write(buffer, 0, buffer.Length);
始终写入65536字节,因此,如果读取少于65536字节,则文件中会出现垃圾

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

compressing.Write(buffer, 0, bytesRead);

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

compressing.Write(buffer, 0, bytesRead);

试着使用来实现这个目标

关于另外一个问题:如果您将代码更改为
string outputPath=.\u gmlPath+“.gz”
,那么如果输入是“foo.gml”,您将得到“foo.gml.gz”而不是“foo.gz”。哦,它可以工作:))非常感谢!
compressing.Write(buffer, 0, bytesRead);