我有一个gzip文件,其中包含需要清除的txt文件。我想逐行从GZipped文件中读取内容,然后将清理后的内容写到输出GZIP文件中,就像下面这样:

    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);
                    }
                }
            }
        }
    }

但是出于某种原因,在while循环中对line = reader.ReadLine()的调用仅读取一次,然后返回null(reader EOS = true)。我已经使用 native C#压缩库和ICSharpCode包进行了尝试,并且得到了相同的行为。我意识到我总是可以提取完整的文件,然后清理它,然后重新压缩它,但是我讨厌不得不浪费资源,硬盘空间等。注意:这些都是大文件(压缩到几GB)使用MemoryStream并不是一个好的解决方案。以前有人遇到过奇怪的事情吗?谢谢你。

最佳答案

在拉了很多头发之后,我似乎发现了问题。对我来说,某些GZip文件可以正常工作,而其他GZip文件可以显示上述行为,这使问题更加复杂。例如,如果我使用GZip自己创建了文件,它将很好用,但是从其他来源生成的某些其他文件则不能。

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

希望这可以帮助其他人遇到同样的问题

关于c# - 带有StreamReader.ReadLine的GZipStream仅读取第一行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25918793/

10-17 01:44