[ Operating System | Reference Manual | Alphabetic Index ]

# canonical_path_name(+Path, -CanonicalPath)

Expand a path name into the full `canonical' form.

Path
  A pathname (atom or string)
CanonicalPath
  Canonical pathname for Path

## Description

This predicate expands a given pathname, and converts it into the `canonical' form of the pathname. The following are done to the path:

- An absolute path is returned. If a relative path is supplied, the path is prefixed with the current working directory. On Windows, a drive name is prefixed, if necessary.
- Leading '~' and environment variables (such as '$HOME') are substituted by the appropriate value. If this substitution is not possible (e.g. if the environment variable does not exist), nothing is changed.
- Special sequences such as '.', '..', extra '/' are appropriately removed/replaced.
- The non-aliased path is returned, i.e. any symbolic links are replaced by the non-symbolic linked version of the path.
- On Windows and Mac OS X, where different cases of letters in path names are allowed but ignored (so e.g. "foo" and "Foo" are aliases), the `normalised' version of the name, using the letter cases when each file/directory was created, is returned (not supported in older versions of Windows before 2000).
- If the path denotes an existing directory, the canonical path is terminated with a '/'.

Not all components of Path need to exist. The removal of aliasing is performed only on the part of the path that does exist.

The type of the returned CanonicalPath is the same as the type of Path (string or atom). If Path is empty, it is replaced by the current working directory.

The predicates canonical_path_name/2 and existing_file/4 are intended as replacement for absolute_file_name/2 in previous releases. The functionality of completing an incomplete name and returning an absolute path of absolute_file_name/2 has been separated. The following approximately implements the old absolute_file_name/2:

        absolute_file_name(Rel, Abs) :-
    	(Rel == user ->
    	    Abs == user  % treat user specially
    	; get_flag(prolog_suffix, Sufs),
    	  (existing_file(Rel, Sufs, [], ExtRel) -> true ; ExtRel = Rel),
    	  canonical_path_name(ExtRel, Abs)
            ).

### Modes and Determinism

- canonical_path_name(+, -) is det

### Exceptions

(5) type error
  Path is not a string or atom.

## Examples

          [eclipse]: canonical_path_name("file", Full).  %cwd is /homes/tom
          Full = "/homes/tom/file"
          yes

          [eclipse]: canonical_path_name(file, Full).
          Full = '/homes/tom/file'
          yes

          [eclipse]: canonical_path_name("~/file", Full).
          Full = "/homes/tom/file"
          yes

          [eclipse]: canonical_path_name('file/..', Full).
          Full = '/homes/tom/'

          [eclipse]: canonical_path_name('/users/tom', Full).
          % /users/tom is a symbolic link for /homes/tom
          Full = '/homes/tom/'

## See Also

existing_file / 4, os_file_name / 2, pathname / 4