- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用以下代码解压缩 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/
我是一名优秀的程序员,十分优秀!