5

在 C# 中,我使用的是DotNetZip , 我有一个名为“innerZip.zip”的 zip,其中包含一些数据,另一个名为“outerZip.zip”的 zip 包含了 innerZip。我为什么要这样做?好吧,在设置密码时,密码实际上适用于添加到存档中的单个条目,而不是整个存档,通过使用这个内部/外部组合,我可以设置整个内部 zip 的通行证,因为它是外一。

问题是,代码比普通话说得更好:

ZipFile outerZip = ZipFile.Read("outerZip.zip");
outerZip.Password = "VeXe";
Stream innerStream = outerZip["innerZip.zip"].OpenReader();
ZipFile innerZip = ZipFile.Read(innerStream); // I'm getting the exception here.
innerZip["Songs\\IronMaiden"].Extract(tempLocation);

为什么我得到那个例外?内部文件是一个 zip 文件,所以我不应该得到那个例外吗?有没有办法解决这个问题,或者我只需要从外部提取内部,然后访问它?

提前谢谢..

4

1 回答 1

7

发生此异常是因为创建的CrcCalculatorStreamOpenReader不可搜索,并ZipFile.Read(Stream)在打开 zip 文件时尝试搜索。

zip 压缩的性质防止在压缩内容中寻找某个位置,因此必须按顺序对内容进行解压缩。

解决此问题的一种方法是将内部 zip 文件提取到 aMemoryStream然后通过ZipFile.Read.

MemoryStream ms = new MemoryStream();
outerZip["innerZip.zip"].Extract(ms);
ms.Seek(0, SeekOrigin.Begin);
ZipFile innerZip = ZipFile.Read(ms);
innerZip["Songs\\IronMaiden"].Extract(tempLocation);
于 2015-04-08T20:34:34.107 回答