LoginSignup
19
18

More than 5 years have passed since last update.

iOS & OS X で zip ファイルをオンメモリで解凍する

Last updated at Posted at 2016-07-24

zip をオンメモリで解凍

iOSOS X のアプリでサーバーよりコンテンツをダウンロードしてデバイスで利用する場合など、やはり zip した内容を解凍して利用するケースは少ないくないと思います。パフォーマンスを上げるためにオンメモリで解凍したい場合もあるかと思います。今回は、そんな場合の為にオンメモリで解凍可能な ZUnzip を紹介いたします。

ZUnzip

ZUnziphttps://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内のファイル名の一覧を StringArray で戻します。サブディレクトリー(フォルダー)は/で区切られたファイル名となります。

ファイルの解凍

解凍するファイルの名前を指定して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)
19
18
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
18