带StreamReader.ReadLine的GZipStream只读第一行

问题描述:

我有一个gzip文件,其中包含需要清理的txt文件。我想从线gzip压缩文件中的行读,然后写了清洗内容输出GZIP文件都在同一个镜头是这样的:带StreamReader.ReadLine的GZipStream只读第一行

void ExtractAndFix(string inputPath, string outputPath) { 
     StringBuilder sbLine = new StringBuilder(); 

     using (GZipStream gzInput = new GZipStream(new FileStream(inputPath, FileMode.Open), System.IO.Compression.CompressionMode.Decompress)) { 
      using (StreamReader reader = new StreamReader(gzInput, Encoding.UTF8)) { 
       using (GZipOutputStream gzipWriter = new GZipOutputStream(new FileStream(outputPath, FileMode.Create))) { 
        string line = null; 
        while ((line = reader.ReadLine()) != null) { 
         sbLine.Clear(); 
         sbLine.Append(line.Replace("\t", " ")); 
         sbLine.Append("\r\n"); 
         byte[] bytes = Encoding.UTF8.GetBytes(sbLine.ToString()); 
         gzipWriter.Write(bytes, 0, bytes.Length); 
        } 
       } 
      } 
     } 
    } 

但由于某些原因,打电话线= reader.ReadLine( )只在while循环中读取一次,然后返回null(reader EOS = true)。我已经尝试了与原生C#压缩库和ICSharpCode包以及我得到相同的行为。我意识到我总是可以提取完整的文件,然后清理它,然后重新压缩它,但我讨厌不得不浪费资源,硬盘空间等。注意:这些是大文件(高达几GB压缩),所以任何东西MemoryStream不会是一个好的解决方案。有没有人遇到过这种奇怪的东西?谢谢。

+0

你确定该文件实际上只是压缩流而不是Zip存档? – 2014-09-18 17:30:25

+2

@ Alexei Levenkov - 如果是Zip,将永远无法创建GZip流,否则会失败,因为文件类型不正确 – bruiseruser 2014-09-18 19:23:16

+0

[使用GZipStream解压仅返回第一行](http:// *的.com /问题/ 11204330 /解压缩使用- - gzipstream-返回仅最一线) – Sam 2017-03-15 23:16:34

经过大量的头发拉动,我似乎发现了问题。对于我来说,这个问题更加复杂的是,某些GZip文件可以正常工作,而其他GZip文件则会显示上述行为。例如,如果我使用GZip自己创建了归档文件,它会很好用,但是从其他来源生成的某些其他归档文件不会。

简而言之,.NET GZip库是垃圾,不要使用它。另外,我使用的ICSharpCode库已经有几年了。我不确定它是否用于搭载底层.NET代码,但我以前的版本(0.85.4)给出了完全相同的行为。当我升级到最新版本(0.86.0)时,它按预期工作,我能够按预期阅读完整文件。

希望这可以帮助有相同问题的其他人