エントリの削除
アーカイブからエントリを削除する操作は、実際には残すエントリだけ他のファイルにコピーすることです。
削除するエントリをファイル名で指定する場合、最低限必要なヘッダ情報は、
- ファイル名
- エントリサイズ(圧縮サイズ)
の2つです。
これらが基本ヘッダから得られるのであれば、拡張ヘッダをパースせずバイト列とみなしてコピーすることができます。
この場合、パースしないので未知の拡張ヘッダも問題なく扱えます。
しかし、どのアーカイバでもややこしい問題があります。
LZHの場合
Level2の基本ヘッダにはファイル名は含まれません。
また、圧縮サイズが4GBを超える場合、ファイルサイズ拡張ヘッダを読む必要があります。
tarの場合
GNU拡張の@LongLinkやpax拡張ヘッダは擬似エントリとして実装されています。
コピーする際は擬似エントリに続く実際のエントリをまとめてコピーする必要があります。
ZIPの場合
ZIPファイルは末尾のセントラルディレクトリにファイル情報の一部がまとめて記録されています。
エントリを削除すると各エントリのオフセットが変わるため、セントラルディレクトリを再構築する必要があります。
結論
- 拡張ヘッダをパースしなければならない
- ヘッダは一旦パースされ、再度デコードされる
- 未知の拡張ヘッダは切り捨てられる
これだと、今までのraw_〜_sourceから読みこんで、raw_〜_sinkに書き込むだけで事足りそうです。