append_lha
LZHファイルの追記サンプルを作成しました。
append_lha.cpp
lhaサンプルとほぼ同じですが、初期化の部分だけ違います。
io_ex::file_sink file; try { // 読み書き(truncなし)でオープンを試みる file.open(argv[1], std::ios_base::binary|std::ios_base::in); } catch (const std::ios_base::failure&) { // ファイルがないので新規作成する file.open(argv[1], std::ios_base::binary); } // エンドマーク(末尾のヌル文字1バイト)に移動 std::streampos pos = io::seek(file, 0, std::ios_base::end); if (io::position_to_offset(pos) != 0) io::seek(file, -1, std::ios_base::cur); // LZHオープン ar::basic_lzh_file_sink<io_ex::file_sink> lzh(file);
単純にファイルに追記するだけなら、ios_base::appでオープンすれば済むのですが、LZHファイルの末尾にエンドマークがあるので、1バイト手前から書き込みを始める必要があります。
これを実現するために、file_sinkにデフォルトコンストラクタを追加しました。
file.hppの差分
このサンプルでは既存アーカイブをパースしていないので、同名のファイルも追加できてしまいます。
そのようなファイルの更新処理も、機能的にはdelete_lhaとappend_lhaの組み合わせで実現可能です。
あとは、エンドマークの扱いを意識させないよう、lzh_file_sinkで隠蔽すべきでしょうね。