2012/11/29

zipzapでZip書庫を操作する

zipzapはZip書庫の圧縮および解凍ができるライブラリです。

以前の記事「Objective-Zipを用いたZip書庫の操作について」で紹介したObjective-Zipよりも手軽に扱えそうなので簡単に紹介します。

zipzapはXcode 4.4、iOS 4.0以降で利用でき、BSDライセンスで提供されています。

事前準備

Xcodeで次の手順を行います。

  1. Add Files to “MyProject”…でzipzapのヘッダのあるフォルダを選択
  2. プロジェクトのBuild Phasesでlibz.dylibを追加
  3. Build SettingsのHeader Search Pathsに../zipzapを追加

あとはヘッダファイルをインポートすれば利用できるようになります。

#import <zipzap/zipzap.h>

ファイル一覧表示

以前のObjective-Zipの記事と比べるために、それに近いサンプルコードを示していきます。

まず、Zipファイル内の一覧を表示するコードを次に示します。 以前の記事中のコードがARC非対応のコードな点を考慮しても、Objective-Zipよりも簡単に書けています。

ZZArchive* archive = [ZZArchive archiveWithContentsOfURL:zipfilePath];
for (ZZArchiveEntry* i in archive.entries) {
    NSLog(@"%@ %u", i.fileName, i.uncompressedSize);
}

dataは呼び出されたときに解凍して全データを返すようになっており、 解凍途中で中断させたいときはNSInputStreamを返すstreamを利用すればよいみたいです。

ファイル解凍

Zipファイル内の最初のエントリのファイルをひとつ解凍するコードを次に示します。

ZZArchive* archive = [ZZArchive archiveWithContentsOfURL:zipfilePath];
ZZArchiveEntry* entry = archive.entries[0];
[entry.data writeToFile:outputPath atomically:YES];

なお、archive.entriesNSArrayなので、ファイル名を指定したい場合はNSPredicateを使うのが楽かもしれません。

NSPredicate* pred = [NSPredicate predicateWithFormat:@"(fileName == %@)", someFileName];
NSArray* filtered = [archive.entries filteredArrayUsingPredicate:pred];
[[[filtered objectAtIndex: 0] data] writeToFile:outputPath atomically:YES];

ファイル圧縮

Zipファイルを作成し、ファイルをひとつ追加するコードを次に示します。clang–3.2から利用できるコンテナリテラルを利用して見やすくなっています。

ZZMutableArchive* archive = [ZZArchive archiveWithContentsOfURL:[NSURL fileURLWithPath:zipfilePath]];
archive.entries = @[
    [ZZArchiveEntry archiveEntryWithFileName:path
                    compress:YES
                    dataBlock:^{ return [NSData dataWithContentsOfFile:path]; } ]
];

なお、圧縮レベルの微調整をしたければ、+archiveEntryWithFileName:fileMode:lastModified:compressionLevel:dataBlock:streamBlock:dataConsumerBlock: を利用するしかないみたいです。

まとめ

zipzapの利用法を簡単に紹介しました。

関連リンク

0 件のコメント:

コメントを投稿

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