什么是GNU tar ././@LongLink"技巧"?

Che*_*eso 15 interop gnu tar

我读的是的"L"(76)焦油条目类型所使用的GNU tar和兼容GNU焦油公用事业表明,在归档中的下一个项目有一个"长"的名字.在这种情况下,条目类型为"L"的标题块通常编码名称././@LongLink.

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

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

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

当条目类型为"L"时,我如何知道"长"文件名有多长?长名称是否限制为512字节,换句话说,什么适合一个块?

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

Che*_*eso 13

只是通过观察单个存档,我猜测了tar档案中的'L'条目类型,以及"././@LongLink"名称:

"L"条目存在于一系列1个或多个512字节块的标题中,这些块包含名称超过100个字符的文件或目录的文件名.例如,如果文件名长度为1200个字符,那么标题块中的大小将为1200,并且将有3个带文件名数据的附加块; 最后一个块被部分填充.

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

编辑
请参阅我的实现:http: //cheesoexamples.codeplex.com/SourceControl/changeset/view/99885#1868643


Ale*_*lke 5

请注意,有关所有这些的信息可以在 libtar 项目中找到:

\n

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

\n

提议的标头libtar.h(与 POSIX 相对tar.h)明确包含长文件名和长符号链接。

\n

获取长文件名/链接的“假”标头+数据,然后获取“真实”标头(实际文件名和符号链接除外)。

\n
HEADER type \'L\'\nBLOCKS of data with the real long filename\nHEADER type \'K\'\nBLOCKS of data with the real symbolic link\nHEADER type \'0\' (or \'5\' for directory, etc.)\nBLOCKS of data with the actual file contents\n
Run Code Online (Sandbox Code Playgroud)\n

当然,在MS-Windows下,你可能不会处理符号链接,尽管在Win7中据说MS-Windows下的符号链接可以工作(最后\xe2\x80\x94这现在在Win10中是正式的!)

\n

相关定义来自libtar.h

\n
/* GNU extensions for typeflag */\n#define GNU_LONGNAME_TYPE   \'L\'\n#define GNU_LONGLINK_TYPE   \'K\'\n
Run Code Online (Sandbox Code Playgroud)\n