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で隠蔽すべきでしょうね。