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

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

Ответ 1

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

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

Ответ 2

Я определенно рекомендую 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];

Ответ 3

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

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

импортировать два класса в вас .m class   "ZipFile.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 в папке Library с backup.zip я надеюсь, что это поможет

Ответ 4

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

RWendi