文件Uri方案和相关文件


73

假定uri的方案是“文件”。还假设路径以“。”开头。

示例路径为“ ./.bashrc”。fulluri看起来如何?'file://./..bashrc'对我来说似乎很奇怪。


3
根据Wikipedia en.wikipedia.org/wiki/Uniform_resource_identifier的说法,当您相对引用时,您显然可以省略该方案,并将“ ./.bashrc”作为uri。但是,这只是一个猜测,我不确定它是否真正起作用。
托尼

2
@Tony-谢谢,在.docx文件中建立相对引用的效果很好-只需解压缩,找到“ file:/// long-absolute-path / relative-path”引用,然后替换为“ relative-path”
tucuxi

严格省略前缀并不总是可行的,因为URI可以具有用百分号编码的特殊字符(例如%20=空格);根据应用程序的不同,您可能需要将转义字符替换为它们的实际表示形式。
sleblanc's

Answers:


78

简而言之,文件URL的形式为:

file://localhost/absolute/path/to/file [ok]

或者,您可以省略主机(但不能省略斜线):

file:///absolute/path/to/file [ok]

但不是这个:

file://file_at_current_dir [no way]

也不是这样:

file://./file_at_current_dir [no way]

我刚刚通过Python的urllib2.urlopen()确认

来自http://en.wikipedia.org/wiki/File_URI_scheme的更多详细信息:

"file:///foo.txt" is okay, while "file://foo.txt" is not,
although some interpreters manage to handle the latter

是否也不能使用file:/ absolute / path或file:relative(即使此操作无效),因为您可以删除文件协议的权限。
Cem Kalyoncu

3
@RayLuo Still仍未回答如何使用相对文件语法“。”创建URI的问题。?
认知

1
@cogmission你没有得到我答案中的第四个例子吗?它清楚地提到了无法使用“”。在URI中。好吧,您可以,这根本没有任何意义,否则就无法实现您可能期望的结果。您也可以在此页面中参考第二高的答题答案。但是,您阅读和弄清楚的时间更长。
RayLuo

RFC3986的第4.2节说相对引用是可以的。在给定上下文(“基本URI”)中解析引用的规范过程。第一个“没有办法”是忽略URI的结构,并且绝不是指路径。第二个是在文件file_at_current_dir系统根目录下命名的文件。在本示例中,我使用Python来强调一个事实,即在构建字符串没有当前目录
amcgregor

@amcgregor正如您所引用的,RFC3986中的相对引用仅在给定上下文(即“基本URI”)中起作用。如果该条件位于使用http://https://方案的网页内,则可以满足该条件。但是file://,在OP提出的方案中,即使调用程序设法解释URI,它在语义上也取决于调用程序的CWD位置。实际上,file://无论如何,您将在哪里使用该uri?如果它是CLI工具,则可以完全避免,file://而只需退回到旧的本地路径即可。如果它在浏览器中,我们也不能假定其CWD。
RayLuo

23

不可能使用完整文件:带有'。'的URI。或路径中没有根部分的“ ..”段。无论您使用“ file://./..bashrc”还是“ file:///....bashrc”,这些路径都没有意义。如果要使用相对链接,请在没有协议/权限部分的情况下使用它:

<a href="./.bashrc">link</a>

如果要使用完整的URI,则必须告诉相对根,您的相对路径是:

<a href="file:///home/kindrik/./.bashrc">link</a>

根据RFC 3986

The path segments "." and "..", also known as dot-segments, are
defined for relative reference within the path name hierarchy.  They
are intended for use at the beginning of a relative-path reference
(Section 4.2) to indicate relative position within the hierarchical
tree of names.  This is similar to their role within some operating
systems' file directory structures to indicate the current directory
and parent directory, respectively.  However, unlike in a file
system, these dot-segments are only interpreted within the URI path
hierarchy and are removed as part of the resolution process (Section
5.2).

The complete path segments "." and ".." are intended only for use
within relative references (Section 4.1) and are removed as part of
the reference resolution process (Section 5.2).  However, some
deployed implementations incorrectly assume that reference resolution
is not necessary when the reference is already a URI and thus fail to
remove dot-segments when they occur in non-relative paths.  URI
normalizers should remove dot-segments by applying the
remove_dot_segments algorithm to the path, as described in Section 5.2.4.

The complete path segments "." and ".." are intended only for use
within relative references (Section 4.1) and are removed as part of
the reference resolution process (Section 5.2) 

RFC 3986甚至描述了删除这些“”的算法。和URI中的“ ..”。


16

在终端中,可以使用“ $ PWD”键入“ file://$PWD/.bashrc”以引用当前目录。


这也适用于相对路径“ file://$PWD/../parentchilddir/somefile.txt”
nilsmagnus

正如@ kai-dj在另一个答案中提到的,如果$PWD包含类似空格的内容,C:/Users/Joshua Pinter/则该路径将无效。需要以某种方式逃脱。
约书亚·品特

您可以使用变量字符串替换,将空格用作转义空间,例如file://${PWD// /\\ }/relative/path
Steve Goossens

注意,反斜杠转义不是正确的格式。这是一个URI。 注意使用百分比编码,因为空格字符本身可以优化到+。另外要注意的是,URI允许UTF-8,所以实际上许多Unicode字符(例如重音字母,表情符号,诸如§等的符号)根本不需要编码。还需要注意的是:未编码的URI将由用户代理自动编码,因此用作字符串(包含空格)可能是可以的。(空格是shell扩展/进程参数列表构建的问题。)
amcgregor

16

您不应在之后加上双斜线file:。正确的形式是

'file:.bashrc'

参见RFC 3986path-rootless定义


4
请参考同一RFC,语法组件的定义,§3和§3.2授权(描述其相对组成,其中涉及//),然后记下RFCfile:§2,定义仅允许方案path-absolute。相对file:URI在技术上不存在,即使某些系统按照约定允许它们也是如此。
amcgregor

1
尝试使此超级烦人的错误静音时,这使PyLD JSON-LD解析引擎感到满意Invalid JSON-LD syntax; @context @id value must be an absolute IRI, a blank node identifier, or a keyword.。我只想要一个相对编号,让我来做!
DeusXMachina

5

我不知道您的用例。

我的节点代码中也有类似的需求,因此当我需要相对于我的工作目录的文件url时,我会像这样创建一个url ...

const url = "file://" + process.cwd() + "/" + ".bashrc";

1

在unix shell脚本中,我设法做到了:

file://`pwd`/relative-path

在您的特定情况下:

file://`pwd`/.bashrc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.