什么是“规范路径”?

Posted

技术标签:

【中文标题】什么是“规范路径”?【英文标题】:What's a "canonical path"? 【发布时间】:2012-08-19 11:32:13 【问题描述】:

因此,绝对路径是一种访问特定文件或位置的方法,该文件或位置描述了到它的完整路径、完整路径以及它依赖于操作系统(Windows 和 Linux 的绝对路径,例如,不同)。另一方面,相对路径是从当前位置..(两个点)描述的文件或位置的路径,表示目录树中的上级。几年来我一直很清楚这一点。

在搜索时,我什至看到也有规范化的文件! 我只知道 CANONICAL 的意思是“按照规则”之类的。

有人可以在有关规范的理论方面启发我吗?

【问题讨论】:

"Système d'exploitation" 是的,我知道法语,但我的意思是操作系统(我拼错了,对不起,呵呵)操作系统...我实际上是墨西哥人 xD 啊,“Sistema de la operción,¡olé!” (顺便说一下,它是“操作系统”。) Emmm... xD 实际上应该是“Sistema Operativo”,Olé 它是非常西班牙语(西班牙),是的,我知道它正在运行,我又失败了,我分心了哈哈谢谢 =) @Editor,虽然我同意没有 真正的 词“规范化”,但认为开发人员不会连词(“enverb”)词也是错误的 all 时间。出于搜索目的,任何一个都可能有效。 @DaveNewton 我询问“规范化”路径的原因是因为使用 Aptana Studio 3,其中工具提示命令、方法等,我读到了 realpath: "php API.- realpath($path) @return string the canonicalized成功的绝对路径名”这就是我创建这个问题的原因,以便清楚地理解这句话;) 【参考方案1】:

使任何东西“规范”的全部意义在于让您可以比较两件事。例如,../../here/bar/x./test/../../bar/x 可能都指向同一个位置,但您不能对这两个路径进行文本比较。但是,如果您将它们转换为它们的规范表示,它们都会变为 ../bar/x,我们看到它们实际上指的是同一个东西。

简而言之,通常情况下,您有多种方式来引用一件事,在这种情况下,您可以定义一个规范的表示,它是唯一的 em> 并允许您处理此类事物的集合。

(如果您正在寻找更多示例,所有数学都充满了各种对象的“规范”结构,并且非常具有相同的目的。也许这个Wikipedia article 可以提供一些额外的方向。 )

【讨论】:

哦,我现在明白了...所以简而言之,规范必须是唯一的,因此它是非常完整的路径,没有相对使用两个点。哦!你的回答很有帮助;)谢谢 @Metafaniel:是的,关键部分是唯一性。我想您可以同时拥有规范的相对路径和规范的绝对路径,但这是一个独立的区别。 一切都很好,直到那个评论 xD OK 我明白了,但是......一个规范的相对路径?正如我到目前为止所了解的(谢谢大家),规范路径本质上是绝对的。关于规范的相对路径,你能告诉我什么? =S 谢谢=) @Metafaniel:规范的相对路径将相对于给定的固定工作目录。 相对于给定目录,您可以形成唯一的相对路径。但是您只能比较相同工作目录的那些。相比之下,规范绝对路径可以在全局范围内进行比较。 如果您在目录或文件上授权硬链接或软链接,这将不起作用......在这种情况下,定义规范路径要困难得多(请参阅答案@alfasin)。【参考方案2】:

定义规范路径的好方法是:the shortest absolute path(简称,字符串长度的意思)。

这是绝对路径和规范路径之间区别的示例:

绝对路径:C:\abc\..\abc\file.txt 规范路径:C:\abc\file.txt

【讨论】:

根据@KerrekSB,路径必须是唯一的规范,所以在你的例子中我可以看到它:没有其他方法可以表示 C:\abc\file.txt 谢谢你的例子=) @alfasin:Microsoft 似乎不同意您关于“Windows 中没有规范路径”的断言,Windows API 函数PathCanonicalize 就证明了这一点。虽然 Windows 通常不会在路径中强制区分大小写(尽管它取决于卷),但 Windows 确实保留了路径中每个字符的大小写,即使它允许不区分大小写的访问。无论如何,我的观点仍然存在,最短的绝对路径不一定是规范的。 @DanKorn 告诉他们与the definition of canonical 争论。至于你的不同意见,你可能是对的,但我还没有看到一个好的反例;) @alfasin:在我看来,除了字典定义之外,微软可以定义他们自己的术语在他们自己的操作系统和 API 中的含义。关于 Windows 中的规范,谁比他们有更高的权威?为什么“C:\PROGRA~1”不是你断言最短路径是规范定义的一个很好的反例? @DanKorn 非常尊重微软(我确实尊重他们)他们无法定义规范的含义。规范的意思是“独特的”或“独特的代表”。由于 Windows 操作系统不区分大小写,因此根据定义,任何路径都不能有一个唯一的表示。它可以是绝对的,但不是规范的。如果您认为这种推理不合理,您可以不同意,但由于这种讨论变得徒劳(我一直在重复和解释我的话),让我们在这里剪掉它并同意不同意。【参考方案3】:

什么是规范路径(或其与绝对路径的区别)取决于系统。 通常,如果(完整)路径包含别名、快捷方式或符号链接,则规范路径会将所有这些解析为它们所引用的实际目录。 示例:如果 /bin/a 是符号链接,您可以在任何您请求绝对路径的地方找到它,例如来自java.io.File#getAbsolutePath 而真正的文件(即链接的实际目标)即usr/local/bin/a 将作为规范路径返回,例如来自java.io.File#getCanonicalPath

【讨论】:

你的评论对我来说也很有用!我现在什至没有想过符号链接!所以一个符号链接它是绝对的但不是规范的......非常全面。但是我有一个新的疑问......硬链接呢?他们还不够绝对吗?谢谢 Depends.For example java.io.File#getCanonicalPath 不解析硬链接 我在 Java 方面开发得不多,我主要是 PHP 人 ;) 感谢您的澄清 =) 重新。硬链接:没有将硬链接解析为规范形式的概念。如果两个文件相互硬链接,它们都指向磁盘上的相同数据,因此不再有任何规范的形式,只有两个相同的文件,其数据实际上占用了相同的磁盘空间。哪个文件首先链接到磁盘上的数据与规范命名的概念无关。见***.com/questions/185899/…【参考方案4】:

当您传递目录而不是文件的名称时,会出现规范路径的大多数问题。对于文件,如果我们提供的绝对路径也是规范路径。但对于 dir,它意味着省略最后一个“/”。例如,“/var/tmp/foo”是规范路径,而“/var/tmp/foo/”不是。

【讨论】:

【参考方案5】:

在 GNU Coreutils 的 readlink 的 documentation 中给出了规范路径的良好定义。指定“规范化模式”返回不包含任何这些内容的等效路径:

    hard links 到自己 (.) 和父 (..) 目录 重复的分隔符 (/) 符号链接

字符串长度无关紧要,如下例所示。

如果您正在运行 linux,您可以尝试使用 readlink -f(规范化模式)或其首选等效命令 realpath,以查看系统上某些程序的“绝对路径”和“规范绝对路径”之间的区别或者正在使用 GNU Coreutils。

我可以使用which在我的系统上获取“java”的路径

$ which java
/usr/bin/java

然而,这条路径实际上是指向另一个符号链接的符号链接。这个符号链接链可以使用namei显示。

$ namei $(which java)
f: /usr/bin/java
 d /
 d usr
 d bin
 l java -> /etc/alternatives/java
   d /
   d etc
   d alternatives
   l java -> /usr/lib/jvm/java-17-openjdk-amd64/bin/java
     d /
     d usr
     d lib
     d jvm
     d java-17-openjdk-amd64
     d bin
     - java

可以使用前面提到的realpath 命令找到规范路径。

$ realpath $(which java)
/usr/lib/jvm/java-17-openjdk-amd64/bin/java

【讨论】:

以上是关于什么是“规范路径”?的主要内容,如果未能解决你的问题,请参考以下文章

python3.6.5 路径处理与规范化

Windows下Node.js中的非规范化路径分隔符

LeetCode——simplify-path

kotlin关于读取文件路径问题

71. 简化路径

将相对路径转换为绝对路径?