チュートリアルの続き

引き続きチュートリアルを書いています。
今日は「tarファイルの展開」と「ZIPファイルの作成」を書きました。
http://hamigaki.sourceforge.jp/doc/html/archivers/tutorial.html
tarの展開は単純なので、ZIPの書き込みを載せておきます。

#include <hamigaki/archivers/zip_file.hpp>
#include <boost/filesystem/fstream.hpp>
#include <boost/filesystem/operations.hpp>
#include <boost/iostreams/copy.hpp>

namespace ar = hamigaki::archivers;
namespace fs = boost::filesystem;
namespace io = boost::iostreams;

void append_file(ar::zip_file_sink& zip, const fs::path& ph)
{
    ar::zip::header head;
    head.path = ph;
    head.file_size = fs::file_size(ph);
    zip.create_entry(head);

    fs::ifstream file(ph, std::ios_base::binary);
    try
    {
        io::copy(file, zip);
    }
    catch (const ar::give_up_compression&)
    {
        file.clear();
        file.seekg(0, std::ios_base::beg);
        zip.rewind_entry();
        io::copy(file, zip);
    }
}

int main()
{
    ar::zip_file_sink zip("test.zip");

    append_file(zip, "foo.txt");
    append_file(zip, "bar.txt");

    zip.close_archive();
}

非圧縮でリトライする箇所を、

    try
    {
        fs::ifstream file(ph, std::ios_base::binary);
        io::copy(file, zip);
    }
    catch (const ar::give_up_compression&)
    {
        zip.rewind_entry();
        fs::ifstream file(ph, std::ios_base::binary);
        io::copy(file, zip);
    }

とすべきか悩みましたが、

  • 同じ事を二度書くのがよろしくない
  • 本質的に二度オープンする必要はない
  • 入出力共に巻き戻す方が統一感がある

ことから上記の形となりました。