在尝试从内部Zip文件(另一个Zip中的Zip)获取流时出现“无法将其读取为Zip文件”异常

问题描述:

在C#中,我正在使用DotNetZip 我有一个zip “innerZip.zip”,其中包含一些数据, 和另一个包含innerZip的称为“outerZip.zip”的zip。 为什么我这样做? 好吧,设置密码时,密码实际上适用于添加到存档而不是整个存档的单个条目,通过使用此内部/外部组合,我可以设置传递给整个内部zip,因为它是一个条目的外部。在尝试从内部Zip文件(另一个Zip中的Zip)获取流时出现“无法将其读取为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文件,所以我不应该得到那个例外吗? 有没有办法解决这个问题,或者我只是从外部提取内部的一个,然后访问它?

感谢名单提前..

会出现此异常,因为CrcCalculatorStream流是OpenReader创建是不可搜索,并ZipFile.Read(Stream)试图寻求在打开zip文件。

zip压缩的性质阻止了在压缩内容中寻找位置,内容必须按顺序解压缩。

解决此问题的一种方法是将内部zip文件解压缩到MemoryStream,然后通过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); 
+1

我知道这篇文章有点过时。但是,谢谢你的提示!它拯救了我的一个同事我的小时工! +1 – 2016-09-15 20:51:41