文件的文件名和路径名

文件的文件名和路径名

据说文件的文件名是指向文件inode的指针。在知道这一点之前,我认为这是完成这项工作的文件的路径名。

我不确定 Unix 中如何定义路径名和文件名。例如, /home/tim/tim.pdf文件名 的文件的路径名是否正确tim.pdf

我想知道文件名和文件路径名有什么区别?谢谢。

答案1

目录包含文件名 ⇒ inode 映射的列表。您的目录/home/tim包含一个带有 filename 的条目tim.pdf,指向(比如) inode 1234

我们如何到达该目录?嗯,目录实际上是一种包含这些条目的特殊文件。我们可以像查找其他文件一样找到它,通过查看其父文件:/home将有一个文件名tim指向目录 inode 的条目。反过来,我们可以/home通过查看其父级来找到/

/是根,而且比较特殊一点。系统知道如何直接访问它,因为它没有父级。

姓名文件的本地名称是它在其目录中的本地名称:tim.pdf.这小路文件的 描述了如何从根目录访问它:/home/tim/tim.pdf.如果您愿意,您可以将其视为一组指令:首先 find /,然后home在其中查找,然后tim,最后tim.pdf是您要查找的内容。

解析任何路径实际上都是使用以下伪代码的递归算法:

inode find_file(inode where_i_am, string[] remaining_path):
    if remaining_path is empty:
         # Nothing more to look at - we've found the file!
         return where_i_am
    current_item = remaining_path[0]
    rest_of_path = remaining_path[1..]
    for entry in directory_entries(where_i_am):
        if entry.filename == current_item:
            return find_file(entry.inode, rest_of_path)
    return file not found

我们会通过以下方式找到您的文件:

find_file(inode_of_root, ["home", "tim", "tim.pdf"])

在某些情况下,事情会变得稍微复杂一些,而伪代码并未涵盖这些情况。其中之一是挂载:当您在 挂载另一个分区时,/home系统会记住,当它进入时,/home它应该转移到另一个分区,并开始tim在该文件系统的根目录中查找。新的文件系统将有自己的一组索引节点,因此您实际上需要知道索引节点和设备才能访问文件的数据。真正的结构实际上包括两者。

符号链接告诉系统此时去查找其他路径,然后从该新位置继续搜索。

另一种情况是硬链接(你的老朋友)。普通文件 inode 可以有任意多个硬链接。您可以使用 建立链接ln tim.pdf pdf.tim,该链接将具有相同的内容并位于磁盘上的同一位置。将会有一个单独的目录条目与 的条目pdf.tim指向相同的 inode 。我们的算法对于这种情况工作得很好:文件的硬链接与原始文件完全相同,我们根本不需要以任何方式区分它。事实上,硬链接只是索引节点的另一个名称,这就是您无法跨文件系统建立硬链接的原因。1234tim.pdf

另一个是特殊条目...。这些是(通常但依赖于文件系统)真实的目录条目。它们本质上是目录本身及其父目录的硬链接。我们的算法也处理这个问题。关于挂载,有一个有趣的情况:因为底层文件系统不知道它将挂载到哪里,所以它无法拥有正确的..条目。为了解决这个问题,系统本质上是作弊并显示..父设备上目录中的条目,而不是来自已安装文件系统的根目录的条目。


因此,当您从 inode 的角度看待事物时,如下所示:

  • A文件名是在特定目录内调用特定索引节点的名称。
  • A小路是有关如何从已知点到达索引节点的一些说明。

答案2

POSIX 术语, A文件名是目录条目的名称。它由除 或 null 之外的非空字节序列组成/。术语“路径名组件”与“文件名”同义。 A路径名是一个字符串,可以包含任何非空字节,并指定定位文件的方式。路径名由一系列文件名组成,其中除了最后一个之外的所有文件名都引用一个目录。路径名解析是从路径名定位文件的过程。

例如,/home/tim/tim.pdf是路径名。该路径名的最后一个组成部分tim.pdf是文件名;它是路径名为 的目录中的条目的名称/home/tim。文件名tim本身就是路径名为 的目录中的条目的名称/home;这个文件恰好是一个目录。tim.pdf也是路径名:任何文件名都是碰巧具有单个组件的路径名,并指定当前目录中具有该名称的文件。

/是指根目录的路径名。.是存在于每个目录中并引用该目录本身的文件名。.是一个路径名,恰好包含单个组件并引用当前目录。

您可以将文件名视为目录中指向索引节点(该索引节点是该目录中的文件)的指针。路径名是在哪里查找 inode 的规范。路径名的每个组成部分都是一个文件名,它指向迄今为止到达的目录中的索引节点(如果文件存在)。路径名要么从根目录开始(如果它们是绝对路径名,以 开头/)或在当前目录(如果它们是相对路径名,不以 ) 开头/

请注意,在许多文本中,“文件名”(或“文件名”)一词用于表示 POSIX 所说的路径名。

答案3

一般来说,pathnamefilenames都是一样的。首先,阅读filenamesPOSIX 文档中的一些规则:

4.6 文件名

对于在符合 IEEE Std 1003.1-2001 的实现之间可移植的文件名,它应仅包含可移植文件名字符集中定义的可移植文件名字符集。

连字符不得用作可移植文件名的第一个字符。大写和小写字母应在一致的实现之间保留其唯一标识。在可移植路径名的情况下,也可以使用斜杠字符。

您可以看到,在本节中,它们使用filenamepathname可以互换。

它们之间也有区别,称为Pathname Resolution

4.11 路径名解析

路径名解析是为进程执行的,以将路径名解析为文件层次结构中的特定文件。可能有多个路径名解析为同一文件。

路径名中的每个文件名都位于其前一个文件指定的目录中(例如,在路径名片段 a/b 中,文件 b 位于目录 a 中)。如果无法完成此操作,路径名解析将失败。如果路径名以斜杠开头,则路径名中第一个文件名的前身应被视为进程的根目录(此类路径名称为“绝对路径名”)。如果路径名不以斜杠开头,则路径名的第一个文件名的前身应被视为进程的当前工作目录(此类路径名称为“相对路径名”)。

pathname解析为文件,文件名位于其前身指定的目录中。

笔记

相关内容