完全限定路径 vs 规范路径

20

Java中有一个规范路径的概念。
而WinApi中有一个完全限定路径。

我很清楚什么是规范路径,但我不理解完全限定路径的概念。(链接)

对于文件或目录,完全限定路径只存在一种情况吗?-像规范路径一样。

这两者的概念完全相同吗?

编辑:
还有一件事, 符号链接或硬链接是否属于完全限定路径?

编辑
我问了一位维护“命名文件、路径和命名空间”页面的人让我知道这个问题的答案。
他回答了我。

这也是完全限定路径吗?
C:\directory\..\directory\file.txt

从技术上讲,这是一个相对路径,因为它包含双点(..),某些API无法正确处理它们(文档将明确声明需要完全限定路径)。
这两者是互斥的。

他的意思是,如果我们将类似于“C:\directory\..\directory\file.txt”这样的参数放入需要完全限定路径的函数中,该函数不会重新解释路径,然后失败。

如果是这样的话,完全限定路径与规范路径完全相同。对吗?


这真是太奇怪了。我认为在Unix上,“..”节点实际上是存在的。因此,“stuff/../otherstuff”已经足够完全合格,如果一个软件愚蠢地处理它,那么它将完美地工作,因为“..”只是另一个目录。如果在Windows领域不是这样,那么这只是另一个奇怪的现象,可以创造更多需要手动处理的边角情况。(典型的微软方式) - v.oddou
2个回答

44

"Fully-qualified path" 同义于 "absolute path"

  • "Fully-qualified""absolute path" 意思相同 - 表示路径不是相对于隐含或指定的上下文。
  • 每个路径都是一个 fully-qualified path 或者是一个 relative path
  • 文件系统上的每个位置都有多条可用于引用它的路径,包括许多 fully-qualified paths:

    • C:\temp.txt
    • C:\Program Files\..\temp.txt
    • C:\Program Files\Microsoft\..\..\temp.txt
    • 等等。
  • 从概念上讲,其中一条 fully-qualified paths 是指定该资源的最简单、最直接的方式 - 这就是你的 canonical path

对于文件或目录,是否只存在一个完全限定路径? - 就像规范化路径。

不,完全限定路径是任何不是相对路径的路径 (不是相对于隐含或指定上下文的当前目录)。多个不同的完全限定路径可能引用文件系统上的同一位置。请重新阅读:

在Java中,getPath()、getAbsolutePath()和getCanonicalPath()有什么区别?

但是将其中所有的"absolute"替换为"fully-qualified"。

要明确的是,有些人也会使用“相对路径”这个术语来指代带有“相对引用”(双点..)的路径。例如,一些人可能会将C:\Program Files\Microsoft\\..\temp.txt称为“相对路径”,因为它含有双点,但我会将其称为带有相对引用的完全限定路径。希望从对话中清楚他们说“相对路径”时的意思(相对于上下文的路径或含有相对引用的路径)。

它们两者概念完全相同吗?

不,正如其他SO问题中所指出的,有许多方法可以指定到某个位置的完全限定路径(绝对路径),但只有其中一个完全限定路径被认为是该位置的规范路径。

还有一件事,UNC路径也属于完全限定路径吗?

是的,UNC路径不是相对路径;它们是完全限定路径。- http://msdn.microsoft.com/en-us/library/aa365247(v=VS.85).aspx#fully_qualified_vs._relative_paths

符号链接或硬链接是否属于完全限定路径?

这是一个独立的概念。路径(无论是相对路径还是完全限定路径)指向文件系统中的位置。该位置的实体可以是以下之一:普通文件、目录、符号链接、硬链接、设备、命名管道等。符号链接或硬链接具有元数据,可导向您实际在该位置寻找的数据。

类比时间

您可以将路径和链接比作前往某人家的方向:

  • 相对路径是从当前位置开始的方向。
  • 完全限定路径是从市政厅开始的方向,无论你在哪里。
    • 在我们奇怪的 Unixville 小镇上,每个人都默认理解“完全限定方向”始于市政厅,更奇怪的是,每个人都称之为“/”。
    • 下一个城镇(Windowsville)有多个市政厅(每个城区一个),分别称为 C:\D:\E:\ 等等。
    • 不同的人可能会给出到达同一所房子的不同方向(路径),即使他们都从同一起点(市政厅)开始 - 有些方向会比其他方向更直接。
  • 规范路径是从市政厅到目标房屋的最简单、最直接的完全限定方向。
  • 符号链接就像一个空地,上面有一张纸条,上面写着前往转发地址的方向。
    • 带领你来到这里的方向类型(无论它们是相对方向、完全限定方向,甚至是规范的完全限定方向)与是否将你带到房子或任何空地都无关。
    • 有一种奇怪的情况,你前进的其中一条街道实际上是一个符号链接(一个绕路?一个门户?) - 如果我们过于仔细地观察它,这个类比就会破裂,所以让我们忽略它吧 :-)
  • 硬链接是可以从两个或多个不同地址访问的房屋。
    • 想象一下在榆树街和主街的拐角处的房子。邮局错误地给了它两个地址:10 Elm Str20 Main Str。无论你去哪个地址,最终都会到达同一个房子。
    • 在我们奇怪的小镇上,这些硬链接房屋可以有多个地址,而且这些地址不必相互靠近。
    • 无论你去哪个地址,进入里面后都是同一个房子。它不是副本,也不是转发地址。只是神奇地,在里面走一遍,不管用哪个地址进来的,最终都会到达同一个房子。
    • 带领你来到这所房子的方向(无论使用哪个地址或者方向是相对方向、完全限定方向,甚至是规范的完全限定方向)与该地址上的房子是否为硬链接房屋无关。

附录

编辑

我询问了一位维护文件、路径和命名空间页面的人,请他告诉我这个问题的答案。 他回复了我。

这也是完全限定路径吗? C:\directory ..\directory\file.txt

我想知道那个页面的维护者用什么术语来区分..\file.txtC:\directory\..\directory\file.txt,因为他称它们都是相对路径。 我同意双点是相对引用,但我不会将整个路径标记为相对路径,因为它在其中间有双点。 在他的术语中,似乎没有完全限定和规范之间的区别。(因此,你的问题的源头就在这里)。

我来自Unix和Java背景,因此可能会有所不同。 按照我的理解:

  • 相对/部分限定 - 如果没有相关上下文提供信息,则无法确定位置,例如当前工作目录、当前驱动器、驱动器的当前目录、shell PATH设置、Java CLASSPATH设置或引用URL。

  • 绝对/完全限定 - 位置与相关上下文无关,即使当前工作目录、当前驱动器、驱动器的当前目录、shell PATH设置、Java CLASSPATH设置或引用URL都没有影响。

  • 规范 - 最简单的完全限定,即没有双点

所以

  • ..\file.txt - 相对路径
  • C:\directory\..\directory\file.txt - 完全限定路径
  • C:\directory\file.txt - 完全限定规范路径

MSDN页面的部分并没有明确说明C:\directory\..\directory\file.txt是什么:如果认为C:\directory\..\directory\file.txt是相对路径,无法与需要完全限定(但不一定是规范的)路径的Windows API一起使用,那么我建议该页面应该更清楚地表述这一点。

完全限定 vs 相对路径

如果文件名不以以下任何一种方式开头,则文件名相对于当前目录

... * 带有反斜杠的磁盘标识符,例如 "C:\" 或 "d:\"。 ...

由于C:\directory\..\directory\file.txt以带有反斜杠的磁盘标识符开头,因此该路径是完全限定路径,而不是相对路径。

一条路径如果包含"双点"(即一个组件中有两个连续的点),也被称为相对路径。这个特殊的标识符用于表示当前目录上一级的目录,也称为"父目录"。以下是该格式的示例:
  • "..\tmp.txt" 指定了一个名为 tmp.txt 的文件,位于当前目录的父目录中。
  • "....\tmp.txt" 指定了一个距当前目录两个目录级别的文件。
  • "..\tempdir\tmp.txt" 指定了一个名为 tmp.txt 的文件,位于名为 tempdir 的目录中,该目录与当前目录同级。
我理解"contains double dots"这个短语意思是指前导的双点。示例仅展示了前导的双点。术语"current directory"通常表示进程的当前工作目录或驱动器的当前目录,这只在谈论前导双点时才有关系。然而,我可以看出这一部分可能会被解释成另一种方式。
无论如何,每个人的成长环境都不同,上下文至关重要,因此我想每个人在阅读文档或与不同背景的工程师讨论“完全限定”与“相对”的含义时都需要注意细微差别。

1
你驾车穿过街道中间的门户,最终到达符号链接的目的地 ;) - Michael Mior
1
我建议该页面需要更清晰地表达。是的,我也这么认为! - Benjamin
1
我不同意你的说法,即“完全限定”和“绝对路径”是相同的。至少在Windows上不是这样。根据此参考(https://learn.microsoft.com/en-us/dotnet/standard/io/file-path-formats),`C:\Documents\Newsletters\Summer2018.pdf`是绝对路径和完全限定路径。路径`\Program Files\Custom Utilities\StringFinder.exe是绝对路径,但不是完全限定路径。如果当前目录是D:,执行该路径将导致执行D:\Program Files\Custom Utilities\StringFinder.exe,而不是C:`驱动器上的那个。 - Mike Christiansen
@MikeChristiansen,你在learn.microsoft.com上引用的页面可能已经更新了,自你发表评论以来。现在它说C:\Documents\Newsletters\Summer2018.pdf是一个绝对文件路径,而\Program Files\Custom Utilities\StringFinder.exe是一个相对路径。 - Theophilus

0

在我看来,只有完全限定路径才能以一种明确的方式找到资源(与当前工作目录、PATH环境等无关),但是两个不同的路径可能标识相同的资源。

我不知道Windows有什么方法可以知道两个路径是否指向同一个文件。


这不会发生。利用这一点可以让同一个 DLL 映射到内存中多次。 - Chris Becke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接