2010/12/09

Objective-Zipを用いたZip書庫の操作について

Objective-Zipは、現在最も普及しているであろう圧縮形式であるZipの圧縮と解凍を行うことができるObjective-Cのライブラリであり、ZLib
Minizipという2つのライブラリを用いています。そのため、Objective-Zip自体は新BSDライセンスですが、ZLibとMiniZipはライセンスが異なる (zlibライセンス) ので注意してください。

Objective-Zipの現時点での最新バージョンである0.7.2は、iOSのバージョン3.1.2から4.2で利用可能です。この記事ではObjective-Zipを用いたZipファイルの操作を簡単に説明します。

事前準備

Xcodeで次の手順を行います。ちなみに、手元の環境ではzlibのライブラリは不要でした。なお、Minizipはzlibを利用してZipファイルの圧縮と解凍を行うライブラリです (zlibはgzipファイルを解凍できるが、zipファイルには対応していない)。

  1. Objective-Zip-0.7.2.zipをダウンロード
  2. Objective-Zip-0.7.2.zipを解凍し、MiniZipとObjective-ZipをDocumentsフォルダに移動
  3. [Add]→[Existing Files...]でMiniZipとObjective-Zipを追加
  4. [Add]→[Existing Frameworks...]でlibz*.dylibを追加 (libz.1.2.3.dylibのみを追加した)

ファイル一覧表示

Zipファイル内の一覧を表示するコードを次に示します。

ZipFile* zip = [[ZipFile alloc] initWithFileName:zipfilePath mode:ZipFileModeUnzip];
NSArray* array = [zip listFileInZipInfos];
for (FileInZipInfo* i in array) {
    NSLog(@"%@ %@", i.name, i.length);
}
[zip close];
[zip release];

ファイル解凍

Zipファイル内から指定したファイルをひとつ解凍するコードを次に示します。zipInfo.sizeは圧縮時のサイズなので間違えないようにしてください。また、全部解凍するときはgoToNextFileInZipを利用したほうがよいでしょう。

ZipFile* zip = [[ZipFile alloc] initWithFileName:zipfilePath mode:ZipFileModeUnzip];
if ([zip locateFileInZip:zipInfo.name]) {
    ZipReadStream* read = [zip readCurrentFileInZip];
    NSMutableData* data = [[NSMutableData alloc] initWithLength:zipInfo.length];
    if ([read readDataWithBuffer:data]) {
       [data writeToFile:outputPath atomically:YES];
    }
    [read finishedReading];
    [data release];
}
[zip close];
[zip release];

ファイル圧縮

Zipファイルを作成し、ファイルをひとつ追加するコードを次に示します。複数のファイルを追加する場合には余分にインデントしている4行の部分を繰り返します。なお、closeを忘れると書庫が壊れてしまうようですので注意してください。

ZipFile* zip = [[ZipFile alloc] initWithFileName:zipfilePath mode:ZipFileModeCreate];
    ZipWriteStream* write = [zip writeFileInZipWithName:[path lastPathComponent]
                                 compressionLevel:ZipCompressionLevelBest];
    NSData* data = [NSData dataWithContentsOfFile:path];
    [write writeData:data];
    [write finishedWriting];
[zip close];
[zip release];

まとめ

Objective-Zipを用いたZipファイルの操作を説明しました。

関連項目

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。