文件Uri方案和相关文件

问题描述 投票:0回答:8

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

示例路径是“./.bashrc”。 Fulluri 看起来怎么样? “file://./.bashrc”对我来说似乎很奇怪。

file uri relative-path url-scheme file-uri
8个回答
100
投票

简而言之,文件 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

27
投票

不可能使用完整的文件:带“.”的 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 的“..”。


24
投票

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


21
投票

您不应在

file:
之后添加双斜杠。正确的形式是

'file:.bashrc'

参见RFC 3986

path-rootless
定义


6
投票

我不知道你的用例。

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

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

5
投票

URI 始终是绝对的(除非它们是相对 URI,这是一种没有模式的不同野兽)。这是因为它们是一种服务器-客户端技术,引用服务器的工作目录是没有意义的。话又说回来,引用文件系统在服务器-客户端上下文中也没有意义🤷。尽管如此,RFC 8089仅允许绝对路径:

路径部分代表文件在文件系统中的绝对路径。

但是,如果我假设一个非标准扩展,我会选择以下语法:

file:file.txt
file:./file.txt

解释是 RFC 8089 指定了非本地路径

file://<FQDN of host>/path
和本地路径
file:/path
file://localhost/path
file:///path
。因为我们几乎肯定会尝试指定本地相对路径(即,可以通过“本地文件系统 API”访问),并且因为
.
不是 FQDN,甚至不是主机名,所以简单的
file:
方案 + 方案-特定部分 URI 语法最有意义。


2
投票

在 unix shell 脚本中我设法做到了这一点:

file://`pwd`/relative-path

在您的具体情况下:

file://`pwd`/.bashrc

1
投票

有一个解决方法可能会有所帮助。

如果在开发时您只能指定文件的相对路径,但需要 URL(需要知道绝对路径),请使用如下代码 (Java):

new File("relative/path/to/file").toURI().toURL();

这样您就可以得到一个仍然指向相对路径中的文件的 URL。

© www.soinside.com 2019 - 2024. All rights reserved.