在C#中,我正在使用 DotNetZip 我有一个名为“innerZip.zip”的zip,其中包含一些数据, 另一个名为“outerZip.zip”的zip包含innerZip。 为什么我这样做? 好吧,在设置密码时,密码实际上适用于添加到存档而不是整个存档的各个条目,使用此内部/外部组合, 我可以设置一个传递到整个内部拉链,因为它是外部拉链的一个条目。
问题是,代码说得比普通词好:
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文件,所以我不应该得到那个例外吗? 有没有办法绕过这个或者我只需要从外部提取内部,然后访问它?
提前完成..
答案 0 :(得分:6)
发生此异常是因为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);