概要
iOSで手っ取り早くZIPファイルの圧縮/解凍する方法を調べてみました。
zlibを使ってC言語で処理を書くなんてこともできるようですが、
Objective-c 一辺倒の私にはこの方法は却下です。
ZipArchiveというライブラリもありますが、こちらはソースコードが古くARCにも対応していません。
で最終的に行き着いたのがSSZipArchiveというライブラリです。
これはZipArchiveをベースに作られたものでARCにも対応しています。
使い方もとてもシンプルだったのでSSZipArchiveが現時点(2013/12/8)では一番よいかと思います。
使い方
まずgithubからソースを取得しましょう。
ソースコード内のSSZipArchive
ディレクトリとその配下にあるminizip
ディレクトリをプロジェクトに追加します。
libz.dylib
をターゲットに追加します。
SSZipArchive.h
ヘッダーをインポートすることも忘れないように。
解凍するとき
// 解凍
NSString *zipFilePath = @"解凍するZIPファイルのパス";
NSString *destinationPath = @"解凍したファイルを展開するディレクトリのス";
BOOL isSuccess = [SSZipArchive unzipFileAtPath:zipFilePath Destination:destinationPath delegate:self];
if (isSuccess) {
// 処理が成功した場合
} else {
// 処理が失敗した場合
}
パスワードを指定する場合
// 解凍
NSString *zipFilePath = @"解凍するZIPファイルのパス";
NSString *destinationPath = @"解凍したファイルを展開するディレクトリのス";
NSString *password = @"パスワード";
NSError *error = nil;
[SSZipArchive unzipFileAtPath:zipFilePath toDestination:destinationPath
overwrite:YES password:password error:&error delegate:self];
if (error) {
// エラーが発生した場合
NSLog(@"error: %@", error);
}
解凍が完了した場合に処理を実行した場合はデリゲートを設定した上で、下記メソッドを実装する
- (void)zipArchiveDidUnzipArchiveAtPath:(NSString *)path zipInfo:(unz_global_info)zipInfo unzippedPath:(NSString *)unzippedPath {
NSLog(@"解凍完了");
}
圧縮する時
// 圧縮
NSString *zippedFilePath = @"圧縮したZIPファイルの保存先パス";
NSArray *inputFilePaths = @[[[NSBundle mainBundle]
pathForResource:@"sampleImage" ofType:@"jpg"],
[[NSBundle mainBundle]
pathForResource:@"sampleText" ofType:@"txt"]];
BOOL isSuccess = [SSZipArchive createZipFileAtPath:zippedFilePath hFilesAtPaths:inputFilePaths];
if (isSuccess) {
// 処理が成功した場合
} else {
// 処理が失敗した場合
}
という事でとても簡単に実装できます。
デリゲートでは無くブロック構文に対応させてもよさそうです。
お試しあれ!