GNU tar ././@LongLink“技巧”到底是什么?

问题描述 投票:0回答:2

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

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

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

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

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

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

interop gnu tar
2个回答
15
投票

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

“L”条目出现在一系列 1 个或多个 512 字节块的标头中,这些块仅保存名称超过 100 个字符的文件或目录的“文件名”。例如,如果文件名长度为 1200 个字符,则标头块中的大小将为 1200,并且将有 3 个附加块包含文件名数据;最后一块已部分填充。 该系列之后是另一个标头块,采用传统形式 - 类型为“0”(常规文件)或“5”(目录)的标头,后跟带有条目数据的适当数量的数据块。在本系列的标题中,名称将被截断为实际名称的前 100 个字符。

编辑

在这里查看我的实现: http://cheesoexamples.codeplex.com/SourceControl/changeset/view/99885#1868643


4
投票

https://repo.or.cz/libtar.git

建议的标头是

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'

© www.soinside.com 2019 - 2024. All rights reserved.