IPhone: загрузка zip и извлечение из основного подкаталога пакета во время выполнения

Я хочу расширить приложение для iPhone, которое приложение загружает zip файл в вспомогательный каталог затем извлекает его, а затем загружает изображения, которые были внутри zip.

Любые идеи по распаковке во время выполнения и доступу к изображениям? Был бы действительно рад за какую-то идею.

Привет,

Ответ 1

Я использовал ZipArchive с успехом в прошлом.

Он довольно веселый и простой в использовании, поддерживает защиту паролем, несколько файлов внутри ZIP, а также сжимает и распаковывает.

Основное использование:

NSString *filepath = [[NSBundle mainBundle] pathForResource:@"ZipFileName" ofType:@"zip"];
ZipArchive *zipArchive = [[ZipArchive alloc] init];
[zipArchive UnzipOpenFile:filepath Password:@"xxxxxx"];
[zipArchive UnzipFileTo:{pathToDirectory} overWrite:YES];
[zipArchive UnzipCloseFile];
[zipArchive release];

Ответ 2

Вы не можете извлечь из своего пакета. Используйте [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0], чтобы получить путь к каталогу, в который вы можете записать.

Вы можете использовать код http://code.google.com/p/ziparchive/ для извлечения файлов из архива zip.

Ответ 3

Если вы добавите ZipArchive в свой проект, не забудьте также добавить фреймворк. Правильная структура libz.dylib. Последняя версия (Xcode 4.2) - 1.2.5.

(Добавьте фреймворк в раздел с библиотеками на вкладке фаз сборки вашей цели.)

Ответ 4

Я предлагаю вам использовать ssziparchive bcoz, он поддерживает проекты ARC и Non ARC.

  • Добавьте SSZipArchive.h, SSZipArchive.m и minizip в свой проект.
  • Добавьте в свою версию последнюю версию библиотеки libz (прямо сейчас ее libz1.2.5).

Вам не нужно ничего делать в отношении ARC. SSZipArchive будет определять, не используете ли вы ARC и добавили требуемый код управления памятью.

И код будет таким:

    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

    // Unzipping

    //If your zip is in document directory than use this code
    NSString *zipPath = [documentsDirectory stringByAppendingPathComponent:@"mediadata.zip"];
    //else if zip file is in bundle than use this code
    NSString *zipPath = [[NSBundle mainBundle] pathForResource:@"mediadata" ofType:@"zip"];

    NSString *destinationPath = [documentsDirectory stringByAppendingPathComponent:@"MediaData"];


    if( [SSZipArchive unzipFileAtPath:zipPath toDestination:destinationPath] != NO ) {
        //unzip data success
        //do something
        NSLog(@"Dilip Success");
    }else{
        NSLog(@"Dilip Error");
    }