CLX C++ Libraries
Home >> unzip

Declarations

template <
    class CharT,
    class Traits = std::char_traits<CharT>
>
class basic_unzip;

typedef basic_unzip<char> unzip;

Overview

unzip は,zip 圧縮されたファイルを操作するためのクラスです.zip では, 複数のファイル/ディレクトリをひとまとめにしてアーカイブ化される事があります. unzip では,この zip アーカイブ内の各要素(ファイル/ディレクトリ)を順に走査する iterator を定義し,通常はこの iterator を通じて各ファイルへアクセスするような実装になっています.

尚,unzip を利用するためには zlib を用意する必要があります.

Example

example_unzip.cpp

#include <iostream>
#include <string>
#include "clx/unzip.h"

int main(int argc, char* argv[]) {
    if (argc < 2) {
        std::cerr << argv[0] << " filename" << std::endl;
        std::exit(-1);
    }
    
    std::string path(argv[1]);
    std::string password;
    if (argc > 2) password = argv[2];
    clx::unzip uz(path, password);
    
    // zip アーカイブ内の各ファイル/ディレクトリへ順にアクセスする場合.
    for (clx::unzip::iterator pos = uz.begin(); pos != uz.end(); ++pos) {
        std::cout << pos->path() << std::endl;
        
        std::string buf;
        // 最初の 10 行を表示
        for (size_t i = 0; i < 10; ++i) {
            if (!std::getline(*pos, buf)) break;
            std::cout << "\t" << buf << std::endl;
        }
        std::cout << std::endl;
    }
    
    // zip アーカイブ内のある 1 つのファイルにアクセスする場合.
    clx::unzip::iterator target = uz.find("document/index.html");
    if (target != uz.end()) {
        std::cout << target->path() << " is found." << std::endl;
    }
    
    return 0;
}
Result
document/

document/acceptor.html
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
      "http://www.w3.org/TR/html4/loose.dtd">
    <html lang="ja">

・・・(中略)・・・

    <meta http-equiv="Content-Script-Type" content="text/javascript">
    
    <script type="text/javascript" src="script/sh_main.js"></script>

document/index.html is found.

unzip オブジェクトを生成した後は,begin() や find() メソッドを用いて zip アーカイブ内の処理を行いたいファイルへアクセスします.これらのメソッドが返す iterator は istream へのポインタ(正確には shared_ptr)なので,*演算子や ->演算子を用いることで, 通常の istream と同様の方法で対象となるファイルの内容を読み取ることができます.

ただし,zip アーカイブ内の複数のファイルへ同時にアクセスすることはできないので, この点に注意する必要があります(find() や iterator の ++演算子で別のファイルへアクセスした時点で, 元のファイルは閉じられる).

Template Parameters

CharT
文字の型を指定します.
Traits
文字列を扱うためのtraitsを指定します.デフォルト値は, std::char_traits<CharT>.

Construction and Member Functions

basic_unzip();
basic_unzip(const basic_unzip& cp);
explicit basic_unzip(const string_type& path);
explicit basic_unzip(const char_type* path);
basic_unzip(const string_type& path, const string_type& password);
basic_unzip(const char_type* path, const char_type* password);
virtual ~basic_unzip() throw();

引数に,対象ファイルへのパス,およびパスワードが指定された場合は, 指定された引数で open() メソッドを実行します.open() メソッドに関しては後述します.

bool open(const string_type& path);
bool open(const char_type* path);
bool open(const string_type& path, const string_type& password);
bool open(const char_type* path, const char_type* password);
bool is_open() const;

引数に指定されたファイルを zip アーカイブと見なして解凍します. zip アーカイブにパスワードが設定されている場合は,第 2 引数でそのパスワードを指定します. 解凍された zip アーカイブ内の各ファイルへは,後述する begin(), find() メソッドなどによって得られる iterator を通じてアクセスします.

void close();

明示的に終了します.close() メソッドを実行せずに終了した場合は, デストラクタが実行されるタイミングで終了します.

bool exist(const string_type& path);
bool exist(const char_type* path);

zip アーカイブ内に path で示されるファイルが存在するかどうかを判別するためのメソッドです.

iterator begin();
iterator end();
iterator find(const string_type& path);
iterator find(const char_type* path);

begin(), end() は zip アーカイブ内の各ファイルを順に走査するための iterator を返します. iterator は,istream へのイテレータとなっています.ただし,std::istream の各メソッドに加えて,zip アーカイブ内でのそのファイルのパスを取得するための path() メソッドを定義しています.

find() メソッドは,zip アーカイブ内の path で示されるファイルに対応する iterator を返します.zip アーカイブ内に path で示されるファイルが存在しない場合は, end() を返します.

handler_type handler() const;
const string_type& password() const;

Related Types

typedef size_t size_type;
typedef CharT char_type;
typedef unzFile handler_type;
typedef std::basic_string<CharT, Traits> string_type;
typedef basic_unzipstream<CharT, Traits> stream_type;
typedef basic_unzipiterator<CharT, Traits> iterator;

Related Page

  1. CLX C++ Libraries - zstream

References

  1. zip の解凍 - Life like a clown
  2. Minizip: Zip and UnZip addtionnal library