我想压缩一些非常大的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(输入中有)...
答案 0 :(得分: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);
答案 1 :(得分:3)
您只想写出当前迭代中读取的字节数,而不是整个缓冲区长度。
compressing.Write(buffer, 0, bytesRead);
答案 2 :(得分:0)
尝试使用SharpZipLib来实现该目标