Схема файла Uri и относительные файлы

Предположим, что схема для URI - это "файл". Также предположим, что путь начинается с '.'

Пример пути - "./.bashrc". Как бы выглядел фуллури? 'file://./.bashrc' кажется мне странным.

8 ответов

Решение

Короче говоря, 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]

Я только что подтвердил это через Pyll's 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

Невозможно использовать полный файл: 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.

В терминале вы можете набрать "file://$PWD/.bashrc", используя "$PWD" для ссылки на текущий каталог.

Вы не должны ставить двойную косую черту после file:, Правильная форма

'file:.bashrc'

См. RFC 3986, path-rootless определение

Я не знаю ваш вариант использования.

У меня аналогичная потребность в коде моего узла, поэтому, когда мне нужен URL-адрес файла относительно моего рабочего каталога, я создаю URL-адрес примерно так...

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

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 локальной файловой системы»), и поскольку .не является полным доменным именем или даже именем хоста, простой file:Синтаксис URI схема + схема-специфическая часть имеет наибольший смысл.

В сценарии оболочки Unix мне удалось пойти с этим:

file://`pwd`/relative-path

В вашем конкретном случае:

file://`pwd`/.bashrc

Существует обходной путь, который может помочь.

Если во время разработки вы можете указать только относительный путь к файлу, но вам нужен URL-адрес (для которого требуется знать абсолютный путь), используйте такой код:

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

При этом вы получаете URL-адрес, по-прежнему указывающий на файл по относительному пути.

Другие вопросы по тегам