2012-08-08 20 views
5

En C#, estoy usando el DotNetZip Tengo un zip llamado "innerZip.zip", que contiene algunos datos, y otro comprimido llamado "outerZip.zip", que contiene el innerZip. Por qué estoy haciendo esto así? bien, al establecer la contraseña, la contraseña en realidad se aplica a las entradas individuales que se agregan al archivo y no todo el archivo comprimido, mediante esta combinación interior/exterior, que podría establecer un pase para todo el interior con cremallera porque es una entrada del exterior.Obteniendo una excepción "No se puede leer como archivo zip" al intentar obtener una transmisión de un archivo Zip interno (un Zip dentro de otro Zip)

El problema es, así, el código habla mejor que las palabras normales:

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

por que tengo esa excepción? el archivo interno es un archivo zip, así que no debería estar recibiendo esa excepción verdad? hay una manera de evitar esto o sólo tengo que extraer el interior del exterior, y luego acceder a ella?

Gracias de antemano ..

Respuesta

6

Esta excepción se produce porque la corriente CrcCalculatorStream que OpenReader crea no es reubicable, y ZipFile.Read(Stream) trata de buscar al abrir el archivo zip.

La naturaleza de compresión zip evita que buscan un lugar en el contenido de cremallera, el contenido debe ser descomprimido en orden.

Una forma de evitar esto sería para extraer el archivo zip interno a un MemoryStream y luego cargar de que a través de 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

Sé que esta publicación es un poco anticuada. ¡Pero gracias por el consejo! ¡Salvó a un colega de mis horas de violín! +1 –

Cuestiones relacionadas