GNU tarを使用します。ファイルの圧縮/解凍時に圧縮タイプを自動検出できます。しかし、標準入力からアーカイブを解凍する必要があり、圧縮タイプは不明です。tarを使用すると、次のような正しい提案ができることに気付きました。
tar: Archive is compressed. Use -z option
しかし、その引数を入力するように要求することなく、tarがその圧縮オプションを自動的に使用するようにします。どうやってやるの?圧縮タイプを既に知っているので、なぜtarは単に解凍しないのですか?
ありがとうございました!
開発するのは難しくありませんでしたが、今まで行われていません。
—
peterh -復活モニカ
これができない理由は、それが読み取られるまで、
—
ケビン・パン粉
tar
どのタイプのデータを保持しているのかわからないためstdin
、解凍プログラムを呼び出すには遅すぎます。gzip、bzip2などをサポートしています。この問題を回避するのは簡単ではありません(データをバッファリングする必要があります)ので、再試行するよう指示されます。
@KevinPankoなぜ遅すぎるのか?いいえ、遅れていません。彼は、バッファー内の最初の4Kを読み取り、その圧縮タイプ(ある場合)をテストしてから、プログラムを呼び出します。このバッファリングは、追加のCコードの10〜20行でした。
—
peterh -復活モニカ
持っているデータがわかっている時点では、単純な
—
ケビンパンコ
fork()
/ exec()
メソッドを使用して、圧縮解除ユーティリティを介してデータをパイプすることはできません。ユーティリティはstdin
パイプから読み取り、最初の4Kは失われます。データを読み込んだ後にパイプにデータを戻す方法はありません。
@KevinPanko:2つのプロセスをフォークすることで実行できますが、基本的にはに相当し
—
Ilmari Karonen
cat buffer - | gunzip
ます。(あるいは、追加のプロセスの必要性を回避するために、ノンブロッキングI / Oを使用できます。)