2008-11-13 14 views
11

Estoy desarrollando una aplicación de iOS, y tratando de comprimir el archivo que he creado en la aplicación, ¿hay alguna función integrada capaz de hacer esto?¿Cómo puedo crear un archivo zip usando Objective C?

+0

¿Para qué necesita esto? ¿Simplemente comprimiendo y enviando un archivo a alguna parte? Si es así, puede usar el zlib que ya está incluido. –

+0

por confirmar su respuesta a [aquí] [1] [1]: http://stackoverflow.com/questions/7386695/how-to-zip-file/18740716#18740716 – Nirmalsinh

Respuesta

9

Como se señaló Alex, que respondieron a this question señalando la NSData category aportado por los usuarios de la wiki Cocoadev. Esa categoría incluye métodos para tratar con datos comprimidos y comprimidos en una instancia de NSData (que podría leerse desde un archivo Zip o escribirse en uno). Esto debería ser todo lo que necesita para implementar el archivo comprimido que describe, siempre y cuando pueda alimentar los datos de su archivo en una instancia de NSData.

Para ver un ejemplo de esta categoría en acción, consulte el código fuente de mi aplicación de iPhone, Molecules. Solo uso el método para extraer datos de un archivo comprimido (en SLSMolecule + PDB.m), pero debería poder obtener los conceptos básicos de eso.

+4

El enlace a la categoría NSData está roto. –

+1

@GlennHowes - Está disponible en el archivo web aquí: http://web.archive.org/web/20100102154917/http://cocoadev.com/index.pl?NSDataCategory, pero edité mi pregunta anterior para incluir la totalidad de la categoría para preservarlo aquí. –

0

No estoy seguro si hay una función incorporada, pero quizás podría usar una biblioteca externa como InfoZip. O, como alternativa, podría intentar implementar su propia biblioteca zip, estoy bastante seguro de que la especificación del formato Zip se puede encontrar en algún lugar de Internet.

RWendi

+0

que he hecho eso. No ciencia de cohetes, pero una buena dosis de tedio. –

2

primero que descargue ejemplo Objetivo-zip de http://code.google.com/p/objective-zip/downloads/list

en este ejemplo Buscar y copiar la carpeta de tres Objetivo-Zip, minizip y arrastre en ZLib a su proyecto

importar dos clases en que .m clase "ZipFile.h" y "ZipWriteStream.h"

crear método para comprimir mi código es: -

-(IBAction)Zip{ 
self.fileManager = [NSFileManager defaultManager]; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory , NSUserDomainMask, YES); 

NSString *ZipLibrary = [paths objectAtIndex:0]; 


NSString *fullPathToFile = [ZipLibrary stringByAppendingPathComponent:@"backUp.zip"]; 

//[self.fileManager createDirectoryAtPath:fullPathToFile attributes:nil]; 

//self.documentsDir = [paths objectAtIndex:0]; 


ZipFile *zipFile = [[ZipFile alloc]initWithFileName:fullPathToFile mode:ZipFileModeCreate]; 

NSError *error = nil; 
self.fileManager = [NSFileManager defaultManager]; 
NSArray *paths1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 

self.documentsDir = [paths1 objectAtIndex:0]; 
NSArray *files = [[NSFileManager defaultManager]contentsOfDirectoryAtPath:self.documentsDir error:&error]; 
//for(NSString *filename in files){ 
    for(int i = 0;i<files.count;i++){ 

     id myArrayElement = [files objectAtIndex:i]; 


    if([myArrayElement rangeOfString:@".png" ].location !=NSNotFound){ 
      NSLog(@"add %@", myArrayElement); 


    NSString *path = [self.documentsDir stringByAppendingPathComponent:myArrayElement]; 
    NSDictionary *attributes = [[NSFileManager defaultManager]attributesOfItemAtPath:path error:&error]; 
    NSDate *Date = [attributes objectForKey:NSFileCreationDate]; 

    ZipWriteStream *streem = [zipFile writeFileInZipWithName:myArrayElement fileDate:Date compressionLevel:ZipCompressionLevelBest]; 
    NSData *data = [NSData dataWithContentsOfFile:path]; 
    // NSLog(@"%d",data); 
    [streem writeData:data]; 
    [streem finishedWriting]; 
     }else if([myArrayElement rangeOfString:@".txt" ].location !=NSNotFound) 
     { 

      NSString *path = [self.documentsDir stringByAppendingPathComponent:myArrayElement]; 
      NSDictionary *attributes = [[NSFileManager defaultManager]attributesOfItemAtPath:path error:&error]; 
      NSDate *Date = [attributes objectForKey:NSFileCreationDate]; 

      ZipWriteStream *streem = [zipFile writeFileInZipWithName:myArrayElement fileDate:Date compressionLevel:ZipCompressionLevelBest]; 
      NSData *data = [NSData dataWithContentsOfFile:path]; 
      // NSLog(@"%d",data); 
      [streem writeData:data]; 
      [streem finishedWriting]; 
    } 
} 

[self testcsv]; 
[zipFile close]; 

} 

su directorio de documentos guardados elemento .png y .txt pasar con velocidad en la carpeta de la biblioteca con backup.zip espero que esto es ayuda

+0

¿Qué es self testcsv? – chostDevil

12

Sin duda, recomiendo Objetivo-Zip. Sólo recientemente se trasladó a https://github.com/flyingdolphinstudio/Objective-Zip:

Algunos ejemplos de su documentación:

Creación de un archivo Zip:

ZipFile *zipFile= [[ZipFile alloc] initWithFileName:@"test.zip" mode:ZipFileModeCreate]; 

Adición de un archivo a un archivo zip:

ZipWriteStream *stream= [zipFile writeFileInZipWithName:@"abc.txt" compressionLevel:ZipCompressionLevelBest]; 

[stream writeData:abcData]; 
[stream finishedWriting]; 

Lectura de un archivo desde un archivo zip :

ZipFile *unzipFile= [[ZipFile alloc] initWithFileName:@"test.zip" mode:ZipFileModeUnzip]; 

[unzipFile goToFirstFileInZip]; 

ZipReadStream *read= [unzipFile readCurrentFileInZip]; 
NSMutableData *data= [[NSMutableData alloc] initWithLength:256]; 
int bytesRead= [read readDataWithBuffer:data]; 

[read finishedReading]; 
+0

Funciona muy bien en Xcode 5.1 y iOS 7.1 –

+0

Recuerde cerrar el archivo por [zipfile cerrar]; –

Cuestiones relacionadas