我使用C#GZipStream类来压缩一些输入数据。问题是输入为空时。在那种情况下,它最终创建一个0字节的文件。当我尝试使用7zip解压缩生成的.gz文件时,它会给出一个错误,指出格式无效。如果我有非空输入,它工作正常。请告诉我如何创建一个将解压缩为0字节文件的有效.gz文件?
var file = new FileStream("foo.txt.gz", FileMode.Create, FileAccess.ReadWrite);
var gzip = new GZipStream(file, CompressionMode.Compress);
var writer = new StreamWriter(gzip);
for (string line in input) {
writer.Write(line);
}
writer.Close();
gzip.Close();
file.Close();
在上面的代码中,如果我的输入'数组为空,我最终编写了一个名为foo.txt.gz的文件,其中包含0个字节,而7zip表示该文件无效。但是如果我有一个非空数组,我会得到一个有效的文件。请告诉我如何修改我的代码以解决问题,即使输入为空,我也会得到一个有效的.gz文件。谢谢!
答案 0 :(得分:3)
不幸的是,这看起来像是在.NET库中实现GZipStream的错误。
根据文档,它应该"显示为有效的空压缩文件"根据MSDN(http://msdn.microsoft.com/en-ca/library/as1ff51s.aspx)。但是,当我测试你的代码和一些变体时,我也得到一个完全空的文件。
作为比较,如果我使用Cygwin创建一个空的gzip文件(echo -n | gzip -9> empty.gz),我会得到一个20字节的文件。
我想你可以通过检测输入为空并手动写出空的GZIP文件来解决它。您可以参考GZIP文件文档(维基百科将是一个很好的起点)手动创建文件,或硬编码程序中空文件所需的20个字节(使用此解决方案,内部时间戳和一些其他标志可能是错误的,但在实践中这可能不会影响你。)
或者,使用实现GZIP的第三方压缩库,如SharpZipLib(http://icsharpcode.github.io/SharpZipLib/)或DotNetZip(http://dotnetzip.codeplex.com/),并使用它们的实现而不是GZipStream。