Как создать zip-файл с помощью Objective C?

Я разрабатываю приложение iOS и пытаюсь zip-файл, который я создал в приложении, есть ли встроенная функция, способная это сделать?

4 ответов


Как отметил Алекс, я ответил на этот вопрос, указывая на категория NSData внесено пользователями Вики Cocoadev. Эта категория включает методы работы с данными zipped и gzipped в экземпляре NSData (которые могут быть прочитаны из Zip-файла или записаны в один). Это должно быть все, что вам нужно для реализации файла, который вы описываете, если вы можете передать свои данные файла в экземпляр NSData.

пример этого категории в действии, пожалуйста, см. исходный код для моего приложения для iPhone, молекулы. Я использую только метод для извлечения данных из файла gzipped (в SLSMolecule+PDB.m), но вы должны быть в состоянии получить Основные понятия из этого.


Я определенно рекомендую Objective-Zip. Он только недавно переехал в https://github.com/flyingdolphinstudio/Objective-Zip:

некоторые примеры из их документации:

создание Zip-файла:

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

добавление файла в zip-файл:

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

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

чтение файла из 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];

сначала вы загружаете пример Objective-zip из http://code.google.com/p/objective-zip/downloads/list

в этом примере найдите и скопируйте три папки Objective-Zip, MiniZip и zlib перетащите в свой проект

импортировать два класса в вас .m-класс "Zip-файл.h " и "ZipWriteStream.h"

создать метод zip мой код: -

-(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];

}

сохраненный элемент каталога документов .png и .txt-файл zipping в папке библиотеки с резервной копией.застежка-молния надеюсь, это поможет


Не уверен, есть ли встроенная функция, но, возможно, вы могли бы использовать внешнюю библиотеку, такую как InfoZip. Или же вы можете попробовать реализовать свою собственную библиотеку zip, я уверен, что спецификацию формата Zip можно найти где-нибудь в интернете.

RWendi