带StreamReader.ReadLine的GZipStream只读取第一行

 龙马精神202502912663 发布于 2022-12-20 17:28

我有一个包含需要清理的txt文件的gzip文件.我想逐行读取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).我已经尝试使用本机C#压缩库和ICSharpCode包,我得到了相同的行为.我意识到我总是可以提取完整的文件,然后清理它,然后重新压缩它,但我不想浪费资源,硬盘空间等.注意:这些是大文件(压缩到几GB)所以任何事情使用MemoryStream不是一个好的解决方案.以前有没有人遇到过这样奇怪的事?谢谢.

1 个回答
  • 经过大量的拔毛后我似乎找到了问题.对我来说,问题进一步复杂化的事实是某些GZip文件可以正常工作,而其他GZip文件会显示上述行为.例如,如果我自己使用GZip创建存档,那么它可以很好地工作,但是从其他来源生成的某些其他存档则不会.

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

    希望这可以帮助其他人解决同样的问题

    2022-12-20 17:31 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有