ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C часть 3

Архивация данных

Трудно недооценить возможности архиватора в любой операционной системе. Кроме экономии места есть возможность сжимать данные под пароль. Если ваша программа получает данные с сервера. Вы хотите, чтобы эти данные никто не прочитал, при этом максимально снизить нагрузку на сеть. Архивация поможет решить обе проблемы одновременно. Чтобы рассмотреть подробнее работу архиватора создадим новый проект на основе представления (View-based Application) и назовем его ArchiverApp. Естественно, что мы не будем писать все функции архиватора, а воспользуемся готовой библиотекой MiniZip. Скачайте, распакуйте и добавьте эту папку в проект. Так же, добавим в проект файл, над которым будем ставить эксперименты.

Библиотека MiniZip не будет работать без фреймверка libz.dylib. Это стандартный Framework, который входит в набор фреймверковiOS. Как добавлять такого типа библиотеки я уже писал в уроке Добавляем в проект Framework. В результате, папка Frameworks в вашем проекте должна выглядеть так:

 

Теперь перейдем непосредственно к программированию. В первую очередь следует импортировать только что добавленную библиотеку. Я это сделал в интерфейсе класса ArchiverAppViewController:

<code data-result="[object Object]">#define DOCUMENTS [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]

#import &lt;UIKit/UIKit.h&gt;
#import "ZipArchive.h"

@interface ArchiverAppViewController : UIViewController {

}

@end</code>

 

Как вы заметили, кроме импортирования класса библиотеки я создал дэфайн, который указывает на путь к папке документов (туда мы будем сохранять наши архивы).
Теперь в реализации класса ArchiverAppViewController в методе viewDidLoad добавим код, который будет сжимать файл logo.png:

<code data-result="[object Object]">- (void)viewDidLoad
{
    [super viewDidLoad];

    ZipArchive *archive = [ZipArchive new];

    NSString *pathToZip = [DOCUMENTS stringByAppendingPathComponent:@"logo.zip"];
    NSString *pathToFile = [[NSBundle mainBundle] pathForResource:@"logo"ofType:@"png"];   

    [archive CreateZipFile2:pathToZip];
    [archive addFileToZip:pathToFile newname:@"logo.png"];

    if(![archive CloseZipFile2]) {
        NSLog(@"Error");
    }

    [archive release];
}</code>

 

Чтобы проверить работоспособность кода — запустите программу. После ее выполнения в папке документов скомпилированного проекта вы увидите файл logo.zip:

Можете распаковать этот файл и вы увидите картинку, которую добавила туда наша программа.

Я советую удалить только что распакованный файл (если вы это сделали), поскольку сейчас мы научим нашу программу это делать. Добавим в реализацию класса метод, который будет выполнять распаковку файла (кроме метода добавьте на интерфейс кнопку, при нажатии на которую будет вызываться этот метод).

<code data-result="[object Object]">- (IBAction)unzipFile {
    ZipArchive *archive = [ZipArchive new];

    NSString *pathToZip = [DOCUMENTS stringByAppendingPathComponent:@"logo.zip"];

    if ([[NSFileManager defaultManager] fileExistsAtPath:pathToZip]) {
        if ([archive UnzipOpenFile:pathToZip]) {
            if(![archive UnzipFileTo:[pathToZip stringByDeletingLastPathComponent] overWrite:YES])
            {
                NSLog(@"Error unzip");
            }
            [archive UnzipCloseFile];
        }
    } else {
        NSLog(@"Not found zip file");
    }

    [archive release];
}</code>

 

Теперь после запуска программы и нажатия на только что добавленную кнопку в каталоге выполненного проекта мы увидим следующую картину:

Распакованный файл можно отобразить на интерфейсе или проводить с ним другие операции.

Как я уже говорил, на архив можно установить пароль. Для этого следует внести изменение лишь в одну строку. Вместо

<code data-result="[object Object]">[archive CreateZipFile2:pathToZip];</code>

 

написать

<code data-result="[object Object]">[archive CreateZipFile2:pathToZip Password:@"pass"];</code>

 

Теперь, при попытке распаковать такой архив вы получите пустой распакованный файл. Единственное, что с него можно взять полезное — это его имя. Но если в методе распаковки вместо строчки

<code data-result="[object Object]">if ([archive UnzipOpenFile:pathToZip]) {</code>

 

написать

<code data-result="[object Object]">if ([archive UnzipOpenFile:pathToZip Password:@"pass"]) {</code>

 

все будет работать как прежде, только теперь с использованием пароля.

Поскольку архиватор мини — в нем нет возможности задать метод сжатия. Но я думаю, что будет достаточно уже имеющихся способов работы с архивами. Исходный код этого проекта можно скачать здесь.

Comments are closed.