2012-05-14 37 views
0

从GzipStream解压缩时,出现IO异常“GZip页脚中的流大小与实际流大小不匹配”。此错误发生在多个文件的100%时间,所以我不认为这是一个“真正的”损坏的文件问题。GZip页脚中的流大小与实际流大小不匹配

压缩代码如下:

using (var fileStream = fileInfo.OpenRead()) 
      { 
       using (var outFile = File.Create(Path.Combine(backupLocation, backupFileName.ToString()))) 
       { 
        using (var gzCompressionStream = new GZipStream(outFile, CompressionMode.Compress)) 
        { 
         fileStream.CopyTo(gzCompressionStream); 
        } 
       } 
      } 

被抛出异常的解压缩代码如下:

using (var fileStream = fileInfo.OpenRead()) 
      { 
       // remove the extension 
       var fileName = fileInfo.Name; 
       var originalName = fileName.Remove(fileName.Length - fileInfo.Extension.Length); 

       using (var outFile = File.Create(Path.Combine(transferLocation, originalName))) 
       { 
        using (var gzDecompressionStream = new GZipStream(fileStream,CompressionMode.Decompress)) 
        { 
         gzDecompressionStream.CopyTo(outFile); 
        } 
       } 
      } 
+0

代码看起来很合理。您是否已验证文件名是否有效(即检查一个文件是否使用硬编码名称压缩 - >解压缩)? –

+0

抱歉不太确定我是否关注你,文件名将如何影响解压缩? – Johnv2020

+0

即,压缩:“Source.txt” - >“compressed.compr”,解压缩:“random.file”(而不是“compressed.compr”) - >“Source.txt”(失败,因为“random.file”未压缩所有)。 –

回答

1

所有,感谢您的帮助 - 看起来像我发现问题。当压缩文件大小大于4GB时,我只会收到一个错误,低于此一切正常, - 这应该不是问题,因为MSDN指出GZipStream适用于文件大小高达8GB的.Net 4(其中I正在使用),最大文件大小将始终低于6GB(应用程序限制)。但以前版本的GZipStream只支持4GB - 看起来好像MSDN文档在这种情况下不正确。

+1

这是GZipStream中的又一个错误。 gzip流的最后四个字节是未压缩的(未压缩的)长度的模2^32,作为对数据的检查。如果未压缩的长度的低32位匹配,则检查结果是好的。 –

+0

我在这里看到了GZipStream的许多其他问题。其中包括它没有正确使用固定与动态与存储块,导致压缩输出对于短输入而言太大,并且crc不匹配通常未被检测到,导致在出现严重错误时没有错误。我建议不要使用来自Microsoft的这个类。 –