2012-08-08 6 views
5

In C# verwende ich die DotNetZip Ich habe eine Zip namens "innerZip.zip" enthält einige Daten, und eine weitere Zip namens "outerZip.zip", die den innerenZip enthält. Warum mache ich es so? Nun, bei der Einstellung des Passworts gilt das Passwort tatsächlich für einzelne Einträge, die dem Archiv und nicht dem gesamten Archiv hinzugefügt werden. Mit dieser inneren/äußeren Combo, konnte ich einen Pass auf den gesamten inneren zip setzen, weil es ein Eintrag ist von der äußeren.Fehler beim Lesen eines Streams aus einer Inner Zip-Datei (ein Zip in einem anderen Zip)

Problem ist, na ja, Code spricht besser als normale Wörter:

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); 

, warum ich diese Ausnahme bekommen werde? Die innere Datei ist eine Zip-Datei, also sollte ich diese Ausnahme nicht richtig bekommen? gibt es einen Weg, um dies zu umgehen, oder ich muss nur die innere von der äußeren extrahieren, und dann darauf zugreifen?

Thanx im Voraus ..

Antwort

6

Diese Ausnahme tritt auf, weil der CrcCalculatorStream Strom, dass OpenReader schafft nicht durchsuchbar ist, und ZipFile.Read(Stream) versucht zu suchen, während die Zip-Datei zu öffnen.

Die Art der ZIP-Komprimierung verhindert das Suchen nach einem Speicherort im komprimierten Inhalt, der Inhalt muss in der Reihenfolge dekomprimiert werden.

Eine Möglichkeit wäre, die innere Zip-Datei zu einem MemoryStream zu extrahieren und dann über ZipFile.Read zu laden.

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

Ich weiß, dass dieser Beitrag ein bisschen veraltet ist. Aber danke für den Tipp! Es hat einen Kollegen von meinen Stunden des Fiedelns gerettet! +1 –