tar_file_source
今度はlzh_file_sourceと同じインタフェースでtarファイルを扱うクラスを作っています。
読み込みのみ実装できました。
<hamigaki/iostreams/device/tar_file.hpp>
tarファイルの仕様は日本工業標準調査会のJIS X3030(POSIX.1)を参照して書いてのですが、規格が既に古いようでcygwinのtarで作成したファイルは読めませんでした。
GNU tarのマニュアルによると、tarの種類には、
があるようです。
JIS X3030に載っているのは、この中では"ustar"に当たります。
最低限、GNU tar既定の"gnu"と最新のPOSIX仕様である"posix"はサポートしないと使い物にならない感じです。
LZHがアーカイブの中に圧縮イメージを格納するのと違い、tarはアーカイブのみで圧縮はgzip/bzip2等で行います。
そして、Boost.Iostreamsには既にgzipとbzip2のフィルタが存在します。
これらを組み合わせるだけで、tar.gzやtar.bz2を扱うことができます。
// gzip圧縮されたファイルを読むSource typedef io::composite< io::gzip_decompressor, io_ex::file_source > file_type; // tar.gzを読むSource (10/15修正: バイナリモードに変更) io_ex::basic_tar_file_source<file_type> tgz( io::compose( (io::gzip_decompressor()), io_ex::file_source("a.tar.gz", std::ios_base::binary) ) );
う〜ん、今試したら途中でgzip errorになってしまいました。
まだ、どこかバグっているっぽいです。
↑ストリームをバイナリモードに設定するのを忘れてました。