从 MemoryStream 打开 ZIP 包

Open ZIP Package from MemoryStream

我想处理已下载的 ZIP 文件的内容,仅将其存入内存(不使用硬盘!)。 packageStream 包含 ZIP 文件的字节数。

MemoryStream packageStream = // Stream of downloaded ZIP file    
var zipPackage = System.IO.Packaging.Package.Open(packageStream, FileMode.Open, System.IO.FileAccess.Read);
var parts = zipPackage.GetParts();
var rels = zipPackage.GetRelationships();

partsrels 不包含任何项目。

谁能告诉我我做错了什么?

MemoryStream 是错误的流类型吗?

这种场景中,PackageclassZIP文件的class是错误的吗?

如果你能告诉我任何替代方案,请不要使用第三方项目。

谢谢!

更新

This 重复问题中的回答解决了我的问题 (ZipArchive class)。接受的答案使用第三方项目。

如何处理 .zip 文件取决于您使用的框架版本。流是完全可互换的,甚至可以相互封装。问题是,如果您 一个 class 可以实际获取流并执行 zip 操作。

如果您至少拥有 Framework 4.5,那么您将获得 ZipArchive class 并且这一切都是儿戏。这些示例采用 Stream,它可以是 Stream 抽象 class 的任何实现。所有内存流都是只读流。

如果你在那个之下,我很确定你被冲洗干净了。在 4.5 之前,只有 is 没有 class 可以接受 Stream 并对其进行 ZIP 操作。大多数方法包括将 .zip 文件保存在磁盘上并使用带有 IO 重定向的控制台程序对其进行解压缩。 Windows ZIP 功能和 7zip 都适用于此,但都涉及在磁盘上写入。

也许您可以使用 7-zip 的代码部分来执行 in-process/in 内存压缩操作。但这可能有点棘手。