Jan 21

Hoy voy a explicar como se puede comprimir ficheros (formato zip) desde el código.
Es muy útil saberlo porque se usa muchisimo. A la que queramos que el usuario pueda descargar contenidos desde nuestro programa (por ejemplo la galería de fotos que haya creado) o subir grupos de ficheros a Internet vamos a necesitar poder crear zips.
Vamos a ello.
Para crear los zip lo más cómodo (a día de hoy) es usar ZipArchive. Ziparchive es un wrapper para la librería minizip.

Si descargaís el ZipArchive este ya contiene los ficheros de la librería minizip.

Instalación

  1. Descargar el ZipArchive y descomprimirlo.
  2. Crear un nuevo grupo llamado “minizip” en vuestro proyecto.
  3. Añadir los ficheros de la carpeta minizip al grupo minizip de vuestro proyecto.
  4. También añadir los fichero ZipArchive.h y ZipArchive.mm a vuestro proyecto.
  5. Incluir la libreria libz en los frameworks de su proyecto (botón derecha “Add Existing Frameworks”. Libz suele estar en la siguiente carpeta: /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOSNUMERO.sdk/usr/lib. Al escribir este post usaba el siguiente fichero: libz.1.2.3.dylib.

Con esto ya tendremos todo preparado para usar ZipArchive desde nuestro código.

Uso

Ejemplo de compressión de ficheros:

#import "ZipArchive.h"
#define DOCUMENTS_FOLDER [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]
...
ZipArchive *zip = [[ZipArchive alloc] init];
//Creo el fichero zip en la carpeta Documents de mi app
BOOL ret = [zip CreateZipFile2:[DOCUMENTS_FOLDER stringByAppendingString:@"zipEjemplo.zip"]];
 
//Añado el fichero /Documents/prueba.txt al zip
ret = [zip addFileToZip:[DOCUMENTS_FOLDER stringByAppendingString:@"/prueba.txt"] newname:@"prueba.txt"];
 
//Añado el fichero /Documents/prueba2.txt dentro la carpeta PrimeraCarpeta en el zip
ret = [zip addFileToZip:[DOCUMENTS_FOLDER stringByAppendingString:@"/prueba2.txt"] newname:@"PrimeraCarpeta/prueba.txt"];
 
//Al poner en el new name @"PrimeraCarpeta/prueba.txt" automáticamente se creará la carpeta PrimeraCarpeta en el zip.
 
//Finalmente cerramos el zip y liberamos la memoria
if( ![zip CloseZipFile2] ){
	//Si llegamos aquí es que ha habido un error
}
[zip release];

Ejemplo de como descomprimir un zip (este ejemplo está en la documentación oficial):

#import "ZipArchive.h"
#define DOCUMENTS_FOLDER [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]
...
       ZipArchive* za = [[ZipArchive alloc] init];
        if( [za UnzipOpenFile:[DOCUMENTS_FOLDER stringByAppendingString:@"zipEjemplo.zip"]] ) {
                BOOL ret = [za UnzipFileTo:[DOCUMENTS_FOLDER stringByAppendingString:@"/miCarpeta"] overWrite:YES];
                if( NO==ret ){
                        // Gestión de errores
                }
                [za UnzipCloseFile];
        }
        [za release];

Con esto termino este mini artículo sobre zips en el iPhone.
Para dudas/preguntas/correciones podéis usar los comentarios o el foro.

VN:F [1.9.8_1114]
Rating: 0.0/5 (0 votes cast)
VN:F [1.9.8_1114]
Rating: +2 (from 2 votes)
Tagged with:
preload preload preload