PIYO - Tech & Life -

miniz.cを使ってC言語でファイルを展開する

zip C

1ファイルのテキストファイルをzip圧縮したものをC言語のプログラムで元の状態に戻すというサンプルを紹介する。

使うのはzlib互換(?)っぽいminiz.cというオープンソースのライブラリで、このファイルを導入するだけで使えるようになる。zlibを入れるのは手間だというときに使える。

miniz - Single C source file Deflate/Inflate compression library with zlib-compatible API, ZIP archive reading/writing, PNG writing - Google Project Hosting

まずここからminiz.cをダウンロードする。

プロジェクト

miniz.c

今回はXcodeを使ったのでこんな風にプロジェクトに追加する。

main.cpp

#define MINIZ_HEADER_FILE_ONLY
#include "miniz.c"

int main(int argc, const char * argv[])
{
    // 宣言など
    mz_zip_archive zip_archive;
    memset(&zip_archive, 0, sizeof(zip_archive));

    // "hoge.txt.zip"を指定して初期化
    mz_zip_reader_init_file(&zip_archive, "hoge.txt.zip", 0);

    // 0番目(第2引数)のファイルを"hoge.txt"として展開
    mz_zip_reader_extract_to_file(&zip_archive, 0, "decompressed.txt", 0);
    return 0;
}

展開したいファイルとして指定しているhoge.txt.zipは単なるテキストファイルであるhoge.txtをFinder上で右クリックして圧縮したものである。このプログラムを実行するとちゃんと作業ディレクトリにdecompressed.txtができていることがわかる。

複数ファイルやディレクトリを含んだzipファイルを対象にする場合はmz_zip_reader_extract_to_fileの第2引数で何番目の中身を展開するかという指定ができる。

その際にはファイルがいくつあるかを調べたり、N番目のファイルの詳細を調べたりする関数を使って欲しいものを見つける。

  • mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip);
  • mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat);