チュートリアルの続き
引き続きチュートリアルを書いています。
今日は「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); }
とすべきか悩みましたが、
- 同じ事を二度書くのがよろしくない
- 本質的に二度オープンする必要はない
- 入出力共に巻き戻す方が統一感がある
ことから上記の形となりました。