使用ZipArchiveMode.Read时,ZipArchive首个条目流为何不可Seek?
关于ZipArchive第一个条目流无法Seek的问题
这是正常现象,并非异常问题。
ZipArchive.Entries[0].Open()返回的deflate压缩流本身就不支持Seek操作。因为deflate是流式压缩算法,解压缩必须按顺序处理数据,没办法随机定位,所以访问这个流的Position属性时会抛出InvalidOperationException,这完全符合设计预期。- 你提到第二个条目没有这个问题,大概率是该条目未使用deflate压缩(比如采用了存储模式),这种情况下返回的流支持基础的Seek和Position访问;也有可能是打开后续条目时,
ZipArchive已经读取到对应条目的数据位置,内部流状态允许有限的定位操作。
如果需要对第一个条目的流进行Seek操作,可以先把流的内容完整读取到内存流中,再对内存流操作,示例代码:
using (var archive = ZipFile.OpenRead("example.zip")) { var firstEntry = archive.Entries[0]; using (var entryStream = firstEntry.Open()) using (var memoryStream = new MemoryStream()) { entryStream.CopyTo(memoryStream); memoryStream.Position = 0; // 此时可正常Seek和访问Position // 后续对memoryStream执行操作 } }
内容的提问来源于stack exchange,提问作者SpiritBob
相关产品推荐
相关产品推荐

