gpt4 book ai didi

c# - GZipStream with StreamReader.ReadLine 只读取第一行

转载 作者:太空狗 更新时间:2023-10-29 23:07:12 26 4
gpt4 key购买 nike

我有一个 gzip 文件,其中包含一个需要清理的 txt 文件。我想逐行读取 GZip 文件,然后像这样一次性将清理后的内容写入输出 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 创建存档,它会很好用,但从其他来源生成的某些其他存档则不会。

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

希望这对遇到同样问题的其他人有帮助

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com