代码之家  ›  专栏  ›  技术社区  ›  Cheeso

GNU TAR到底是什么?/../@longlink“诡计”?

  •  14
  • Cheeso  · 技术社区  · 14 年前

    I read GNU tar和符合GNU的tar实用程序使用“l”(76)的tar条目类型来指示存档中的下一个条目具有“long”名称。在这种情况下,条目类型为“l”的头块通常对名称进行编码。/./@longlink。

    我的问题是:格式 下一个街区 描述?

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

    如果文件名比头块中分配的空间长,那么gnu tar显然使用了所谓的“the./../@longlink trick”。我找不到确切的描述。

    当条目类型为“l”时,如何知道“long”文件名的长度?长名称是否限制为512字节,换句话说,一个块中可以容纳什么?

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

    2 回复  |  直到 14 年前
        1
  •  12
  •   Cheeso    11 年前

    只需观察一个存档,我就可以推测出tar存档中的“l”条目类型以及“./../@longlink”名称:

    “l”项出现在包含1个或多个512字节块的系列的头段中 只是文件名 对于名称超过100个字符的文件或目录。例如,如果文件名的长度为1200个字符,那么头块中的大小将为1200,另外还有3个带有文件名数据的块;最后一个块是部分填充的。

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

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

        2
  •  2
  •   Alexis Wilke    11 年前

    请注意,所有这些信息都可以在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下的符号链接正在工作(最后)。

    libtar.h中的相关定义:

    /* GNU extensions for typeflag */
    #define GNU_LONGNAME_TYPE   'L'
    #define GNU_LONGLINK_TYPE   'K'