2009-12-17 5 views

Antwort

11

NSData + Compression ist eine benutzerfreundliche Implementierung der NSData-Kategorie.

Verbrauch:

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

Der Code, den ich in dem von Ihnen gemeldeten Link gefunden habe, ist vollständiger, da er auch den Teil enthält, um die CRC32-Prüfsumme zu berechnen. – kiamlaluno

+0

Großartig danke. Es kann auch erforderlich sein, "inflateInit (& strm)" in "-zlibInflate" zu ersetzen, um "inflateInit2" (& strm, 16 + MAX_WBITS) zu '' wenn Sie 'Z_DATA_ERROR' (-3) beim Dekomprimieren von Dateien erhalten, die von einem externen Dienstprogramm erstellt wurden. –

+1

URL nicht gefunden, bitte Link aktualisieren! Immer noch relevant... –

0

Als Alternative gibt es auch objective-zip, das ist „, eine kleine Cocoa/Objective-C-Bibliothek, die Wraps ZLib und MiniZip in einer objektorientierten freundlichen Art. "

Schreiben einer Datei in eine „.zip“ Archiv ist einfach, wie die Ausführung der folgenden Code ein:

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

Die Bibliothek ermöglicht auch den Inhalt einer „.zip“ Datei zu lesen, und die Dateien aufzulisten es beinhaltet.

Das Auflisten des Inhalts einer ".zip" -Datei erfolgt anhand eines Codes ähnlich dem folgenden.

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

Hier ist, was für mich gearbeitet: 1) ZLib Basis Objective-Zip neuen Standort: https://github.com/gianlucabertani/Objective-Zip

Podfile:

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

Schnell Beispiel:

#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) Andere zlib basierte Bibliothek funktionierte auch gut. https://github.com/ZipArchive/ZipArchive

Anmerkung: Manchmal ist es erforderlich libz.tbd (neuer Name von zlib.dylib) auf "Link-Binary mit Bibliotheken"

Schnell Beispiel hinzuzufügen:

#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]]; 
    } 
}