在尝试从内部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 – 2016-09-15 20:51:41