2011-01-14 44 views
7

¿He comenzado a usar zlib 1.2.5 y no veo ninguna rutina para extraer de un archivo zip? Leí sobre una aplicación de minizip, parte de la distribución.zlib C++ y extracción de archivos

¿Es así como se supone que debe hacerse?

Respuesta

21

Sí, lo hace bien. (Pero si alguna vez no te gusta el código C, usted debe buscar en SDK 7-zip que tiene código en C++ y C#.)

  • Todas las funciones para navegar y descomprimir los archivos de un archivo zip se encuentran en : unzip.h
  • Todas las funciones comprimen y añadir archivos a un archivo zip están en: zip.h

(mirar contrib\minizip\unzip.h y contrib\minizip\zip.h)

por ejemplo descomprimir: unzOpen() las funciones de su archivo zip devuelve una unzFile

a continuación, utilizar unzGoToFirstFile() y unzGoToNextFile() en este unzFile a navegar a través de todos los ficheros del archivo.

se obtiene la información de archivo para cada archivo con unzGetCurrentFileInfo(), es decir, por su tamaño,

seguramente le debe llamar unzOpenCurrentFile() en algún momento.

y llame al unzReadCurrentFile() usando el tamaño de fileinfo, recuperando el contenido binario del archivo archivado.

opcionalmente, hay una estructura opaca que puede proporcionar para usar su propia función de E/S, pero obviamente hay una implementación de win32 predeterminada para acceso a archivos, por lo que incluso podría no preocuparse por eso.

PD: y no se olvide de llamar unzCloseCurrentFile()

+1

Ok, encontré las funciones y estoy usando miniunzip para probar. Creé un archivo c: \ a.zip con 7zip. Contiene un archivo.Ejecuto miniunzip -x c: \ a.zip -d c: \ reza y y unzOpen2_64 falla. Estoy ejecutando esto en Windows. ¿Alguna idea de por qué este es el caso? – reza

+0

Estos enlaces están muertos. – kberson

+0

@kberson thx por la observación. He actualizado los enlaces para que apunten a https://github.com/madler/zlib/blob/master/contrib/minizip –

6

De: http://www.zlib.net/zlib_faq.html#faq11: 11. ¿Puede zlib manejar archivos .zip?

No solo, no. Consulte el directorio contrib/minizip en la distribución de zlib.

No hay un tutorial allí, pero la fuente minizip zip.c es exactamente para IO (así que presumiblemente compresión y descompresión) en archivos zip usando zlib.

Y todavía no hay un tutorial PERO http://www.winimage.com/zLibDll/minizip.html da más detalles.

2

he construido una envoltura alrededor de minizip añadiendo algunas características que necesitaba y lo que es más agradable para usarlo. Es hace uso de la última C++ 11 y se desarrolla utilizando Visual Studio 2013 (debe ser portátil, pero yo no lo he probado en UNIX)

Hay una descripción completa aquí: https://github.com/sebastiandev/zipper

puedes comprimir toda carpetas, secuencias, vectores, etc. También una buena característica es hacer todo en su totalidad en la memoria.

+0

¿Es posible reemplazar elementos en una carpeta zip con su envoltorio? Tengo un caso en el que necesito extraer un archivo de un zip, hacer algunos cambios y volver a escribirlo en el zip (sobrescribiendo lo que hay ahora) sin sobreescribir el archivo zip completo. Parece que podría usar la clase descomprimir primero para extraer y modificar el archivo y luego usar la función de agregar en la clase de cremallera con el mismo nombre de archivo para sobrescribirlo. – Wes

+0

minizip no tiene esa funcionalidad, ni siquiera eliminar del zip. Creo que el estándar zip ofrece la posibilidad de hacerlo, pero debería implementarse primero en minizip y luego agregarse a este contenedor. Esto se centró más en la compresión de datos, especialmente en la memoria para el uso interno de aplicaciones donde la compresión simple era el objetivo, pero no realmente orientada o pensada para ser utilizada para editar y modificar las cremalleras. – Sebastian