从不可搜索的流中打开 System.IO.Packaging.Package

Posted

技术标签:

【中文标题】从不可搜索的流中打开 System.IO.Packaging.Package【英文标题】:Opening a System.IO.Packaging.Package from a non-seekable Stream 【发布时间】:2015-04-30 11:07:27 【问题描述】:

我正在尝试解压缩从 Web 服务器收到的 System.IO.Packaging.Package。也就是说,我正在使用System.IO.Packaging.Package.Open(Stream) 方法并将System.Net.HttpWebResponse 的响应流传递给它。不幸的是,这引发了System.ArgumentException 告诉我它

无法对不支持搜索的 [a] 流进行操作。

查看参考源,发现System.IO.Packaging.Package 使用System.IO.Packaging.ZipPackage 作为其唯一实现,而后者又使用内部ZipArchive 类。果然,如果stream.CanSeekfalseValidateModeAccessStreamStreamingCombinations() 方法会在第 588 行引发此异常,我的HttpWebResponse 的响应流就是这种情况。

但是,有一个神奇的 streaming 参数,显然它始终是 false,并从 Package.Open() 方法一直传递到 ValidateModeAccessStreamStreamingCombinations()

所以这是我的问题:有什么方法可以使用Package.Open(Stream) 从不可搜索的流中即时构建Package?还是我必须在某处缓存流内容,例如在MemoryStream 中? (我真的不想这样做,因为一旦我解压了包流,我就对它不感兴趣了。)

【问题讨论】:

【参考方案1】:

嗯,没关系。 streaming 参数仅用于即时写入 System.IO.Packaging.Package。从line 954 开始,有一堆“Write-time streimg API”方法。还有一个ThrowIfInStreamingCreation() 方法,它只会在我尝试编写包时引发异常。

是的,我必须将来自HttpWebResponse 的不可搜索流缓存在MemoryStream 或临时文件中。我没有即时拆包:(

【讨论】:

以上是关于从不可搜索的流中打开 System.IO.Packaging.Package的主要内容,如果未能解决你的问题,请参考以下文章

如何从 .NET 中的流中获取 MemoryStream?

如何在 node.js 中搜索字符串的流?

如何从我的流中获取数据并使用它?

从使用 fmemopen 创建的流中读取宽字符

如何从 iOS 中的流中接收数据(swift)

ExifLib 需要一个可搜索的流