?- uri_file_name('http://www.example.com/toppy',FileName). false.
?- uri_file_name('file:///toppy',FileName). FileName = '/toppy'.
Sadly, doesn't like "remote file URLs" either (but really should):
?- uri_file_name('file://vms.host.edu/disk$user/my/notes/note12345.txt',FileName). false.
?- uri_file_name('file://localhost/disk$user/my/notes/note12345.txt',FileName). FileName = '/disk$user/my/notes/note12345.txt'.
This looks ok too:
?- uri_file_name('file://localhost/disk$user/my/notes/',FileName). FileName = '/disk$user/my/notes/'.
?- uri_file_name(URI,'/usr/lib/shadow.so'). URI = 'file:///usr/lib/shadow.so'.
For a relative filename, the predicate prepends the current working directory of swipl. See working_directory/2.
?- working_directory(X,X). X = '/home/paquette/'. ?- uri_file_name(X,'foo/bar'). X = 'file:///home/paquette/foo/bar'.
In particular, section 3.10 of RFC 1738:
3.10 FILES The file URL scheme is used to designate files accessible on a particular host computer. This scheme, unlike most other URL schemes, does not designate a resource that is universally accessible over the Internet. A file URL takes the form: file://<host>/<path> where <host> is the fully qualified domain name of the system on which the <path> is accessible, and <path> is a hierarchical directory path of the form <directory>/<directory>/.../<name>. For example, a VMS file DISK$USER:[MY.NOTES]NOTE123456.TXT might become <URL:file://vms.host.edu/disk$user/my/notes/note12345.txt> As a special case, <host> can be the string "localhost" or the empty string; this is interpreted as `the machine from which the URL is being interpreted'. The file URL scheme is unusual in that it does not specify an Internet protocol or access method for such files; as such, its utility in network protocols between hosts is limited.