文件的文件名和路径名

Tim*_*Tim 4 filenames files

据说文件的文件名是一个指向文件inode的指针。在知道之前,我认为它是执行该工作的文件的路径名。

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

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

Mic*_*mer 6

一个目录包含一个文件名列表?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
Run Code Online (Sandbox Code Playgroud)

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

find_file(inode_of_root, ["home", "tim", "tim.pdf"])
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


因此,当您从这样的 inode 的角度看待事物时:

  • 一个文件名是一个特定的inode被称为特定目录中的名称。
  • 一个路径是如何从一个已知点到达一个inode一些指令。


Gil*_*il' 4

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

\n\n

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

\n\n

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

\n\n

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

\n\n

请注意,在许多文本中,单词 \xe2\x80\x9c 文件名\xe2\x80\x9d (或 \xe2\x80\x9c 文件名\xe2\x80\x9d)用于表示 POSIX 所说的路径名。

\n