Format
A file URI takes the form of file://''host''/''path'' where ''host'' is theHow many slashes?
* The // after the ''file:'' denotes that either a hostname or the literal termlocalhost
will follow, although this part may be omitted entirely, or may contain an empty hostname.
* The single slash between ''host'' and ''path'' denotes the start of the local-path part of the URI and must be present.
* A valid file URI must therefore begin with either file:/path
(no hostname), file:///path
(empty hostname), or file://hostname/path
.
* file://path
(i.e. two slashes, without a hostname) is never correct, but is often used.
* Further slashes in ''path'' separate directory names in a hierarchical system of directories and subdirectories. In this usage, the slash is a general, system-independent way of separating the parts, and in a particular host system it might be used as such in any pathname (as in Unix systems).
There are two ways that Windows UNC filenames (such as \\server\folder\data.xml
) can be represented. These are both described in RFC 8089, Appendix E as "non-standard". The first way (called here the 2-slash format) is to represent the server name using the ''Authority'' part of the URI, which then becomes file://server/folder/data.xml
. The second way (called here the 4-slash format) is to represent the server name as part of the ''Path'' component, so the URI becomes file:////server/folder/data.xml
. Both forms are actively used. Microsoft .NET (for example, the method new Uri(path)
) generally uses the 2-slash form; Java (for example, the method new URI(path)
) generally uses the 4-slash form. Either form allows the most common operations on URIs (resolving relative URIs, and dereferencing to obtain a connection to the remote file) to be used successfully. However, because these URIs are non-standard, some less common operations fail: an example is the ''normalize'' operation (defined in RFC 3986 and implemented in the Java java.net.URI.normalize()
method) which reduces file:////server/folder/data.xml
to the unusable form file:/server/folder/data.xml
.
Examples
Unix
Here are twoWindows
Here are some examples which may be accepted by some applications on Windows systems, referring to the same, local file ''c:''\''WINDOWS''\''clock.avi'' file://localhost/c:/WINDOWS/clock.avi file:///c:/WINDOWS/clock.avi Here is the URI as understood by the Windows Shell API: file:///c:/WINDOWS/clock.avi Note that the drive letter followed by a colon and slash is part of the acceptable file URI.Implementations
Windows
On Microsoft Windows systems, the normal colon (:) after a device letter has sometimes been replaced by a vertical bar (, ) in file URLs. This reflected the original URL syntax, which made the colon a reserved character in a path part. SinceUrlCreateFromPath
, and to convert a URL to a path, use PathCreateFromUrl
.
To access a file "the file.txt", the following might be used.
For a network location:
file://hostname/path/to/the%20file.txt
Or for a local file, the hostname is omitted, but the slash is not (note the third slash):
file:///c:/path/to/the%20file.txt
This is not the same as providing the string "localhost" or the dot "." in place of the hostname. The string "localhost" will attempt to access the file as UNC path \\localhost\c:\path\to\the file.txt
, which will not work since the colon is not allowed in a share name. The dot "." results in the string being passed as \\.\c:\path\to\the file.txt
, which will work for local files, but not shares on the local system. For example file://./sharename/path/to/the%20file.txt
will not work, because it will result in ''sharename'' being interpreted as part of the DOSDEVICES namespace, not as a network share.
The following outline roughly describes the requirements.
* The colon should be used, and should ''not'' be replaced with a vertical bar for Internet Explorer.
* Forward slashes should be used to delimit paths.
* Characters such as the hash (#) or question mark (?) which are part of the filename should be Legacy URLs
To aid the installed base of legacy applications on Win32PathCreateFromUrl
recognizes certain URLs which do not meet these criteria, and treats them uniformly. These are called "legacy" file URLs as opposed to "healthy" file URLs.\\remotehost\share\dir\file.txt
would become file:////remotehost/share/dir/file.txt
instead of the "healthy" file://remotehost/share/dir/file.txt
.
Web pages
File URLs are rarely used in Web pages on the public Internet, since they imply that a file exists on the designated host. The ''host'' specifier can be used to retrieve a file from an external source, although no specific file-retrieval protocol is specified; and using it should result in a message that informs the user that no mechanism to access that machine is available.References
{{URI scheme Internet Standards Identifiers URI schemes