【cocos2d-x】zipファイルを操作する

c++

cocos2d-xではunzipと言うファイルが存在します。
これを使えば比較的簡単にzipファイルを操ることが出来ます。

サンプルプログラム

string filepath = FileUtils::getInstance()->getWritablePath() + "temp.zip";
unzFile zippedFile = unzOpen(filepath.c_str());

unz_global_info global_info;
if (unzGetGlobalInfo(zippedFile, &global_info) != UNZ_OK)
{
    unzClose(zippedFile);    
    return;
}

unzGoToFirstFile(zippedFile);
for (int i = 0; i < global_info.number_entry; i++)
{
    char filename[100];
    if (unzGetCurrentFileInfo64(zippedFile, NULL, filename, 100, NULL, 0, NULL, 0) != UNZ_OK)
    {
        unzClose(zippedFile);
        break;
    }
    
    string fileName(filename);
    CCLOG("%s", fileName.c_str());
    unzGoToNextFile(zippedFile);
}
unzClose(zippedFile);

解説

それでは解説を入れていきましょう。

L.1, L.2

パスを指定し、unzFile型の変数へと格納していきます。
これはunzipされた結果のハンドルオブジェクトです。
以後はこの変数を用いてunzipされた結果を見ていきます。
もし、失敗していればNULLが返却されます。

その場合はunzip.cppのL.626〜L.738辺りにブレークポイントを置いてしらべてみましょう。

L.5

得られたzipの情報を取得します。
unz_global_infoは以下の様な構造体です。

typedef struct unz_global_info_s
{
    uLong number_entry;
    uLong size_comment;
} unz_global_info;

L.12

zip内のファイルの最初のファイルにカーソルを合わせます。

L.13

for文で、zip内に含まれるファイル数分回す様にしています。

L.15

filinameはファイル名を保持するためのchar型の配列です。ここでは100と決め打っていますがファイル名を確保出来るように十分な大きさを入れておいてください。

L.16

ファイル名を取得しています。
そして、それをstringに変更し、出力すると言った流れです。

L.24

次のファイルにカーソルを合わせます。

L.26

zip内のファイル操作が終わったら必ずunzCloseメソッドを呼びます。

一つ困った事が…

多分zipファイルを操るときってどっかにリソースがあって、それをダウンロードして来た後だと思うんです。
unzipのインターフェースを見るとconst char* pathばかりが並びローカルに保存してあるzipファイルしか扱いませんと言わんばかり。
HTTPResponseのgetResponseData()で取得出来るstd::vector<char>*型の変数から直接unzip出来る方はないのかなぁと思ったりしています。

誰かのお役に立てば。

[sc:link_cocos] [sc:ad_banner]

コメント

  1. とおりすがり より:

    ZipUtils の inflateMemory っていう関数がありますが、これでローカルに保存されていなくても、メモリ上にある zip ファイルの展開ができる気がするんですがどうでしょう?

    あと、 getResponseData() でとれるのは vector* というより、std::vector* 型ですね。

    • Dalt より:

      > ZipUtils の inflateMemory っていう関数がありますが、これでローカルに保存されていなくても、メモリ上にある zip ファイルの展開ができる気がするんですがどうでしょう?
      うわーーーーーーー、めっちゃありがとうございます!
      試してみます!!!!

      > getResponseData() でとれるのは vector* というより、std::vector* 型ですね。
      ありがとうございます。編集しておきますね^^

タイトルとURLをコピーしました