20

「L」(76) の tar エントリ タイプは、gnu tar および gnu 準拠の tar ユーティリティで使用され、アーカイブ内の次のエントリが「長い」名前であることを示していることを読みましたこの場合、エントリ タイプが「L」のヘッダー ブロックは通常、名前 ././@LongLink をエンコードします。

私の質問は:次のブロックのフォーマットはどこに記述されていますか?

tar アーカイブの形式は非常に単純です。つまり、一連の 512 バイト ブロックです。通常、tar アーカイブ内の各ファイルは、一連のブロックとして表されます。最初のブロックはヘッダー ブロックで、ファイル名、エントリ タイプ、変更時刻、およびその他のメタデータが含まれます。次に、必要な数の 512 バイト ブロックを使用して、未加工のファイル データが続きます。それでは次のエントリー。

ファイル名がヘッダー ブロックに割り当てられたスペースに収まらない場合、gnu tar は明らかに「././@LongLink トリック」として知られているものを使用します。私はそれについての正確な説明を見つけることができません。

エントリ タイプが「L」の場合、「長い」ファイル名の長さを知るにはどうすればよいですか? 長い名前は 512 バイト、つまり 1 つのブロックに収まるものに制限されていますか?

最も重要なこと:これはどこに文書化されていますか?

4

2 に答える 2

15

単一のアーカイブを観察しただけで、tar アーカイブの「L」エントリ タイプと「././@LongLink」名について推測したことは次のとおりです。

「L」エントリは、100 文字を超える名前のファイルまたはディレクトリのファイル名だけを保持する一連の 1 つ以上の 512 バイト ブロックのヘッダーに存在します。たとえば、ファイル名の長さが 1200 文字の場合、ヘッダー ブロックのサイズは 1200 になり、ファイル名データを含む 3 つの追加ブロックが存在します。最後のブロックは部分的に埋められています。

このシリーズに続いて、従来の形式の別のヘッダー ブロックが続きます。タイプ '0' (通常のファイル) または '5' (ディレクトリ) のヘッダーの後に、エントリ データを含む適切な数のデータ ブロックが続きます。このシリーズのヘッダーでは、名前は実際の名前の最初の 100 文字に切り捨てられます。

EDIT
ここで私の実装を参照してください: http://cheesoexamples.codeplex.com/SourceControl/changeset/view/99885#1868643

于 2010-01-16T22:37:55.770 に答える
4

これらすべてに関する情報は、libtar プロジェクトで見つけることができることに注意してください。

http://www.feep.net/libtar/

提案されたヘッダーはlibtar.h(POSIX とは対照的にtar.h) 長いファイル名と長いシンボリック リンクを明確に含んでいます。

「偽の」ヘッダーと長いファイル名/リンクのデータを取得し、その後に「実際の」ヘッダー (実際のファイル名とシンボリック リンクを除く) を取得します。

HEADER type 'L'
BLOCKS of data with the real long filename
HEADER type 'K'
BLOCKS of data with the real symbolic link
HEADER type '0' (or '5' for directory, etc.)
BLOCKS of data with the actual file contents

もちろん、MS-Windows ではおそらくシンボリック リンクを処理しませんが、Win7 では MS-Windows でのシンボリック リンクが機能すると言われています (ついに、これは Win10 で正式になりました!)。

からの適切な定義libtar.h:

/* GNU extensions for typeflag */
#define GNU_LONGNAME_TYPE   'L'
#define GNU_LONGLINK_TYPE   'K'
于 2013-06-20T01:28:33.537 に答える