gpt4 book ai didi

c# - 我真的被迫 ReadToEnd() 读取 Ionic.Zlib.GZipStream 的 StreamReader 吗?

转载 作者:太空狗 更新时间:2023-10-29 17:56:36 27 4
gpt4 key购买 nike

我正在使用以下代码解压缩 GZipStream(使用 DotNetZip library),其中 fs 是指向 gz 文件的文件流(使用 FileMode.Open、FileAccess.Read、FileShare.ReadWrite):

using (var gz = new GZipStream(fs, CompressionMode.Decompress)) {
using (var sr = new StreamReader(gz)) {
header = sr.ReadLine();
}
}

但是如果文件直到最后都没有被读取(我更喜欢在不需要的时候这样做,因为文件可能很大),它会抛出

ZlibException("GZIP 预告片中的 CRC32 错误。(actual(EC084966)!=expected(8FC3EF16))")

在第一个右括号上(实际上是在尝试 Close() StreamReader 时。

现在,如果在关闭流阅读器之前调用 ReadToEnd()(或者我使用 while(!sr.EndOfStream) 循环读取所有行),它会起作用。我在 500 MB 和 200 kB 的压缩文件中观察到相同的行为,因此它似乎与文件大小无关。

非常欢迎您的见解!

这里是 a link to a simple dedicated test project .

它与 System.IO.GZipStream 库一起工作,所以这很奇怪。

最佳答案

作为一个猜想,我怀疑如果 CRC block 位于文件的末尾,那么如果我中止读取流,它在处理流时无法验证完整性,因此会抛出异常。

然而,这并不能解释为什么它在使用 System.IO.GzipStream 时有效。

我找到了 DotNetZip 源代码的相关部分 here ,但他们似乎正在检查流是否已读取到末尾(参见 //Make sure we have read to the end of the stream)。然后,他们确实计算了一个 CRC32,因为异常消息显示了一个。

关于c# - 我真的被迫 ReadToEnd() 读取 Ionic.Zlib.GZipStream 的 StreamReader 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7462220/

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