20

我读到gnu tar 和符合 gnu 的 tar 实用程序使用 tar 条目类型 'L' (76) 来指示存档中的下一个条目具有“长”名称。在这种情况下,条目类型为“L”的标题块通常编码名称 ././@LongLink 。

我的问题是:下一个块的格式在哪里描述?

tar 存档的格式非常简单:它只是一系列 512 字节的块。在正常情况下,tar 存档中的每个文件都表示为一系列块。第一个块是头块,包含文件名、条目类型、修改时间和其他元数据。然后是原始文件数据,根据需要使用尽可能多的 512 字节块。然后是下一个条目。

如果文件名长于头块中分配的空间,gnu tar 显然使用了所谓的“././@LongLink 技巧”。我找不到它的准确描述。

当条目类型为“L”时,我如何知道“长”文件名有多长?长名称是否限制为 512 字节,换句话说,任何内容都可以放在一个块中?

最重要的是:这在哪里记录?

4

2 回答 2

15

仅通过观察单个存档,我推测 tar 存档中的“L”条目类型和“././@LongLink”名称:

'L' 条目出现在一系列 1 或多个 512 字节块的标头中,这些块包含名称超过 100 个字符的文件或目录的文件名。例如,如果文件名是 1200 字符长,那么头块中的大小将是 1200,并且将有 3 个额外的带有文件名数据的块;最后一个块被部分填充。

该系列之后是另一个标头块,采用传统形式 - 类型为“0”(常规文件)或“5”(目录)的标头,后面是具有条目数据的适当数量的数据块。在本系列的标题中,名称将被截断为实际名称的前 100 个字符。

编辑
在这里查看我的实现: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 回答