gzip_params::file_name

archive.cpp/extract.cppで.gz(.tar.gzではない)を扱えるようにしようと思って、いろんなアーカイバの動きを調べていたんですが、展開時になぜかファイル名が復元されてびっくりしました。
gzipの仕様を確認したところ、ファイル名、コメント、最終更新時間、さらには拡張フィールドまで持っていることが分かりました。
Boost.Iostreamsのgzip_paramsにも確かにそんな項目がありました。
http://www.boost.org/libs/iostreams/doc/classes/gzip.html#gzip_params
早速gzip_compressor/gzip_decompressorを使って、擬似アーカイバクラスを作成しようと考えましたが、

  • gzip_paramsはgzip_compressorのコンストラクタでしか設定できない。
  • gzip_decompressorはフィルタなのでヘッダの情報を取得するには最低1バイト読み出す必要がある。

等の問題があって、gzipフィルタを使わずに自前でヘッダをパースした方が楽な感じです。
gzip(というかdeflate)は自分で終端を検知できるので、理論上はgzipファイルを単純に連結すればアーカイブとしても使用できるはずです。
2ファイル以上に対応するのも面白いかもしれません。
対応しているアーカイバがあるか不明ですが、、、。


ちなみに、bzip2にはこういったヘッダ情報はないようです。