2008-12-20
iPhoneレシピ5:zipファイルを解凍する
ポイント
iPhoneにはzlibが入っているので、それを利用して解凍する。
zlibを使うためには、libz***.dylibへのリンクが必要。そのためには、xcodeで「グループとファイル」ビュー上で右クリック→「追加」→「既存のフレームワークを追加」でibz***.dylibを追加すればよい。
生のzlibをそのまま使うのはちょっと面倒だが、zlibと一緒に配布されているminizipをさらにObjective-Cでラップした「HetimaUnZip.framework」をHetimaさんが公開している。
HetimaUnZipはCocoaを使っているため、iPhoneで利用できるよう、Cocoaへの依存部分および不要なminizipファイルの削除と、メモリ上ではなく、直接ファイルに解凍するメソッドを追加したものを利用する。
オリジナルのFrameworkをiPhone上で使う方法が分からないため、とりあえず直接ソースのまま取り込んで使う。
改変したHetimaUnZipはここからダウンロードできる。
ソース
NSString *filePath = @"zipファイルへのパス"; HetimaUnZipContainer *unzipContainer = [[HetimaUnZipContainer alloc] initWithZipFile:filePath]; [unzipContainer setListOnlyRealFile:YES]; HetimaUnZipItem *item; NSEnumerator *contentsEnum = [[unzipContainer contents] objectEnumerator]; // プログレスバー表示用に全ファイルのサイズを取得 expectedUmcompressedContentSize = 0; for (item in contentsEnum) { expectedUmcompressedContentSize += [item uncompressedSize]; LOG(@"zip\tpath:%@\t%d", [item path], [item uncompressedSize]); } // 解凍 contentsEnum = [[unzipContainer contents] objectEnumerator]; for (item in contentsEnum) { NSString *path = [[NSFileManager defaultManager] suggestFilePath:[APPLICATION_DOC_DIR stringByAppendingPathComponent:[item path]]]; BOOL result = [item extractTo:path delegate:self]; if (!result) { NSString *err = [NSString stringWithFormat:NSLocalizedString(@"Failed to extract %@.", nil), [item path]]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:err delegate:actionSheet cancelButtonTitle:nil otherButtonTitles:@"OK",nil]; [alert show]; [alert release]; } } // HetimaUnZipItemDelegate // HetimaUnZipItem#extractTo:delegate:の解凍状況はdelegateのメソッドで取得できる。 - (void)item:(HetimaUnZipItem *)item didExtractDataOfLength:(NSUInteger)length { progressBar.progress = progressBar.progress + ((long double)length / (long double)expectedUmcompressedContentSize) * 0.5f; LOG(@"Extracting %f", progressBar.progress); }
トラックバック - http://d.hatena.ne.jp/hisaboh/20081220/p3
リンク元
- 812 http://nmisawa.blogspot.com/2009/02/zip.html
- 640 http://d.hatena.ne.jp/moto_maka/20090220/1237837989
- 476 http://d.hatena.ne.jp/moto_maka/20090217/1234818851
- 450 http://d.hatena.ne.jp/iphone_dev/20091119/1258595529
- 434 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1145444166
- 343 http://www.google.co.jp/search?client=safari&rls=en&q=UIProgressView&ie=UTF-8&oe=UTF-8&redir_esc=&ei=SpyHS6neC8yIkAX4j-TzDw
- 336 http://www.google.co.jp/search?q=iphone+zip&ie=UTF-8&oe=UTF-8&hl=ja&client=safari
- 315 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja-JP-mac:official&hs=jSh&q=NSURLConnection+GET&btnG=検索&lr=lang_ja
- 301 http://www.google.co.jp/search?q=UIProgressView&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a
- 268 http://www.google.co.jp/
