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);