zip をオンメモリで解凍
iOS
や OS X
のアプリでサーバーよりコンテンツをダウンロードしてデバイスで利用する場合など、やはり zip した内容を解凍して利用するケースは少ないくないと思います。パフォーマンスを上げるためにオンメモリで解凍したい場合もあるかと思います。今回は、そんな場合の為にオンメモリで解凍可能な ZUnzip
を紹介いたします。
ZUnzip
ZUnzip
は https://github.com/codelynx/ZUnzip から取得できます。
ZUnzip の初期化
ZUnzip
はzipファイルのパスを渡すもしくは、zipファイルのデータを渡して初期化します。
let path = ...
let unzip = ZUnzip(path: path)
let data = ...
let unzip = ZUnzip(data: data)
ファイルの一覧
let files = unzip.files
files
メソッド(プロパティ)でzip内のファイル名の一覧を String
の Array
で戻します。サブディレクトリー(フォルダー)は/
で区切られたファイル名となります。
ファイルの解凍
解凍するファイルの名前を指定してdataForFile()
を呼び出します。ファイルが存在しなければ、もしくは解凍に失敗した場合は nil
が戻ります。
if let imageData = unzip.dataForFile("sample/sample.jpg") {
// ...
}
用例
zipのバイナリデータからメモリ上に直接JPEG画像を解凍する場合。
import ZUnzip
let data = ...
if let unzip = ZUnzip(data: data) {
if let imageData = unzip.dataForFile("sample/sample.jpg") {
if let image = UIImage(data: imageData) {
// ...
}
}
}
zipファイルからメモリ上に直接JPEG画像を解凍する場合。
import ZUnzip
let path = ...
if let unzip = ZUnzip(path: path) {
if let imageData = unzip.dataForFile("sample/sample.jpg") {
if let image = UIImage(data: imageData) {
// ...
}
}
}
License
libzip
のライセンスは https://nih.at/libzip/LICENSE.html をごらんください。ZUnzip
のライセンスは MITとなっております。
最後に
なんとか Swift だけで zip を解凍できるソルーションを探していましたが、見つかりませんでした。libzip
をなんとか、Swift から呼び出して使えるようにモジュール化したかったのですが、数行ではうまく説明できませんが、結果的にはできませんでした。
もしどなたか、libzip
をうまく swift でモジュール化、もしくは、そもそもlibzip
を Swift に移植できたら是非教えてください。よろしくお願いいたします。
執筆時の環境は以下の通りになります。
Xcode Version 7.3.1 (7D1014)
Apple Swift version 2.2 (swiftlang-703.0.18.8 clang-703.0.31)