什么是“规范路径”?
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
【讨论】:
以上是关于什么是“规范路径”?的主要内容,如果未能解决你的问题,请参考以下文章