使用GZipStream压缩空输入会导致C#中的gz文件无效

Gad*_*air 6 c# compression gzip gzipstream

我使用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();
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,如果我的'input'数组为空,我最终会写一个名为foo.txt.gz的文件,其中包含0个字节,而7zip表示该文件无效.但是如果我有一个非空数组,我会得到一个有效的文件.请告诉我如何修改我的代码以解决问题,即使输入为空,我也会得到一个有效的.gz文件.谢谢!


编辑:这可能是.NET中的一个错误.如果您发现了同样的问题,并一致认为这是一个错误,请投上:https://connect.microsoft.com/VisualStudio/feedback/details/888912/gzipstream-creates-invalid-gz-files-when-input-是空的

Ste*_*ven 4

不幸的是,这看起来像是 .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 的 3rd-party 压缩库,例如 SharpZipLib ( http://icsharpcode.github.io/SharpZipLib/ ) 或 DotNetZip ( http://dotnetzip.codeplex.com/ ),并使用其实现而不是 GZipStream。