![文件的文件名和路径名](https://linux22.com/image/40698/%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%E5%92%8C%E8%B7%AF%E5%BE%84%E5%90%8D.png)
据说文件的文件名是指向文件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 。我们的算法对于这种情况工作得很好:文件的硬链接与原始文件完全相同,我们根本不需要以任何方式区分它。事实上,硬链接只是索引节点的另一个名称,这就是您无法跨文件系统建立硬链接的原因。1234
tim.pdf
另一个是特殊条目.
和..
。这些是(通常但依赖于文件系统)真实的目录条目。它们本质上是目录本身及其父目录的硬链接。我们的算法也处理这个问题。关于挂载,有一个有趣的情况:因为底层文件系统不知道它将挂载到哪里,所以它无法拥有正确的..
条目。为了解决这个问题,系统本质上是作弊并显示..
父设备上目录中的条目,而不是来自已安装文件系统的根目录的条目。
因此,当您从 inode 的角度看待事物时,如下所示:
- A文件名是在特定目录内调用特定索引节点的名称。
- A小路是有关如何从已知点到达索引节点的一些说明。
答案2
在POSIX 术语, A文件名是目录条目的名称。它由除 或 null 之外的非空字节序列组成/
。术语“路径名组件”与“文件名”同义。 A路径名是一个字符串,可以包含任何非空字节,并指定定位文件的方式。路径名由一系列文件名组成,其中除了最后一个之外的所有文件名都引用一个目录。路径名解析是从路径名定位文件的过程。
例如,/home/tim/tim.pdf
是路径名。该路径名的最后一个组成部分tim.pdf
是文件名;它是路径名为 的目录中的条目的名称/home/tim
。文件名tim
本身就是路径名为 的目录中的条目的名称/home
;这个文件恰好是一个目录。tim.pdf
也是路径名:任何文件名都是碰巧具有单个组件的路径名,并指定当前目录中具有该名称的文件。
/
是指根目录的路径名。.
是存在于每个目录中并引用该目录本身的文件名。.
是一个路径名,恰好包含单个组件并引用当前目录。
您可以将文件名视为目录中指向索引节点(该索引节点是该目录中的文件)的指针。路径名是在哪里查找 inode 的规范。路径名的每个组成部分都是一个文件名,它指向迄今为止到达的目录中的索引节点(如果文件存在)。路径名要么从根目录开始(如果它们是绝对路径名,以 开头/
)或在当前目录(如果它们是相对路径名,不以 ) 开头/
。
请注意,在许多文本中,“文件名”(或“文件名”)一词用于表示 POSIX 所说的路径名。
答案3
一般来说,pathname
和filenames
都是一样的。首先,阅读filenames
POSIX 文档中的一些规则:
4.6 文件名
对于在符合 IEEE Std 1003.1-2001 的实现之间可移植的文件名,它应仅包含可移植文件名字符集中定义的可移植文件名字符集。
连字符不得用作可移植文件名的第一个字符。大写和小写字母应在一致的实现之间保留其唯一标识。在可移植路径名的情况下,也可以使用斜杠字符。
您可以看到,在本节中,它们使用filename
并pathname
可以互换。
它们之间也有区别,称为Pathname Resolution
:
4.11 路径名解析
路径名解析是为进程执行的,以将路径名解析为文件层次结构中的特定文件。可能有多个路径名解析为同一文件。
路径名中的每个文件名都位于其前一个文件指定的目录中(例如,在路径名片段 a/b 中,文件 b 位于目录 a 中)。如果无法完成此操作,路径名解析将失败。如果路径名以斜杠开头,则路径名中第一个文件名的前身应被视为进程的根目录(此类路径名称为“绝对路径名”)。如果路径名不以斜杠开头,则路径名的第一个文件名的前身应被视为进程的当前工作目录(此类路径名称为“相对路径名”)。
pathname
解析为文件,文件名位于其前身指定的目录中。
笔记