2009-12-17 10 views

Respuesta

11

NSData + Compression es una implementación de categoría de NSData fácil de usar.

Uso:

NSData* compressed = [myData zlibDeflate]; 
NSData* originalData = [compressed zlibInflate]; 
+0

El código que encontré en el enlace que informó es más completo, ya que también incluye la parte para calcular la suma de comprobación CRC32. – kiamlaluno

+0

Gracias. Además, puede ser necesario reemplazar 'inflateInit (& strm)' en '-zlibInflate' por' inflateInit2 (& strm, 16 + MAX_WBITS) 'si obtiene' Z_DATA_ERROR' (-3) al intentar descomprimir archivos creados por una utilidad externa. –

+1

URL no encontrada, ¡por favor actualice el enlace! Aun relevante... –

0

Como alternativa, también hay objective-zip, que es, "una biblioteca pequeña Cocoa/Objective-C que envuelve ZLib y MiniZip de una manera amigable orientada a objetos ".

Creación de un archivo en un ".zip" archivo es simple como ejecutar el siguiente código:

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

La biblioteca también permite leer el contenido de un archivo ".zip", y enumerar los archivos contiene.

Al listar el contenido de un archivo ".zip" se hace desde un código similar al siguiente.

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

for (FileInZipInfo *info in infos) { 
    NSLog(@"- %@ %@ %d (%d)", info.name, info.date, info.size, info.level); 

    // Locate the file in the zip 
    [unzipFile locateFileInZip:info.name]; 

    // Expand the file in memory 
    ZipReadStream *read = [unzipFile readCurrentFileInZip]; 
    NSMutableData *data = [[NSMutableData alloc] initWithLength:256]; 
    int bytesRead = [read readDataWithBuffer:data]; 
    [read finishedReading]; 
} 
1

Esto es lo que funcionó para mí: 1) ZLib basado Objetivo-Zip nueva ubicación: https://github.com/gianlucabertani/Objective-Zip

PODFILE:

pod 'objective-zip', '~> 1.0' 

Ejemplo rápido:

#import "ViewController.h" 
#import "Objective-Zip.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSString *docsDir; 
    NSArray *dirPaths; 
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    docsDir = [dirPaths objectAtIndex:0]; 
    NSString *path = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent:@"test.zip"]]; 

    OZZipFile *zipFile= [[OZZipFile alloc] initWithFileName:path 
                 mode:OZZipFileModeCreate]; 
    NSString *str = @"Hello world"; 
    OZZipWriteStream *stream= [zipFile writeFileInZipWithName:@"file.txt" 
              compressionLevel:OZZipCompressionLevelBest]; 
    [stream writeData:[str dataUsingEncoding:NSUTF8StringEncoding]]; 
    [stream finishedWriting]; 
    [zipFile close]; 
} 

2) Otra biblioteca basada en zlib funcionó bien también. https://github.com/ZipArchive/ZipArchive

nota: A veces es necesario añadir libz.tbd (nuevo nombre de zlib.dylib) a "Enlace binario con Bibliotecas"

ejemplo rápido:

#import "SSZipArchive.h" 
... 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSString *docsDir; 
    NSArray *dirPaths; 
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    docsDir = [dirPaths objectAtIndex:0]; 
    NSError *error;   
    NSString *str = @"Hello world"; 
    NSString *fileName = [docsDir stringByAppendingPathComponent:@"test.txt"]; 
    BOOL succeed = [str writeToFile:fileName atomically:YES encoding:NSUTF8StringEncoding error:&error]; 
    if (succeed){ 
     NSString *path = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent:@"test.zip"]]; 
     [SSZipArchive createZipFileAtPath:path withFilesAtPaths:@[fileName]]; 
    } 
} 
Cuestiones relacionadas