スポンサーリンク

libzipを試す(展開)

以下は、zipファイル内の三番目(index==2)のファイルを展開するプログラム。

コード

#include <zip.h>

#include <iostream>

#pragma comment(lib,"zip.lib")

int main(int argc, char* argv[])
{
  // ZIPファイルを読み取り専用で開く
  int errorp;
  zip_t* zipper = zip_open(R"(C:\test\zipdata.zip)", ZIP_RDONLY , &errorp);

  // ZIP内のファイルの個数を取得
  zip_int64_t num_entries = zip_get_num_entries(zipper, 0);

  // ZIP内のファイルの各ファイル名を取得
  std::cout << "count: " << num_entries << std::endl;
  for (zip_int64_t index = 0; index < num_entries; index++) {
    std::cout << "[" << index << "]" << zip_get_name(zipper, index, ZIP_FL_ENC_RAW) << std::endl;
  }

  // ZIP内の2番目のファイルに関する情報を取得する
  struct zip_stat sb;
  zip_int64_t index = 2;
  zip_stat_index(zipper, index, 0, &sb);

  // 2番目のファイルのファイルサイズと同じメモリを確保する
  char* contents = new char[sb.size];

  // 2番目のファイルの内容をメモリに読み込む
  zip_file* zf = zip_fopen(zipper, sb.name, 0);
  zip_fread(zf, contents, sb.size);
  zip_fclose(zf);

  zip_close(zipper);
  //////////////////
  // ファイル名を出力できる形に変更
  // ファイル一覧は階層構造をしておらず、ディレクトリ区切りは'/'で直接出力できないので
  // ファイル名中の'/'を'-'に置き換える。
  // 本来なら再帰的にディレクトリを作るなどすべき。
  std::string target = sb.name;
  for (size_t i = 0; i < target.size(); i++) {
    if (target[i] == '/') {
      target[i] = '-';
    }
  }
  //
  //////////////////
  // 解凍したファイルを作成
  std::string outname = R"(C:\test\)" + target;
  FILE* of = fopen(outname.c_str(), "wb");
  fwrite(contents, 1, sb.size, of);
  fclose(of);
  int i;
  std::cin >> i;
}

ファイルの構造

実行結果

表示

ファイル

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: