Rev 86027 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
% File src/library/utils/man/normalizePath.Rd% Part of the R package, https://www.R-project.org% Copyright 1995-2016 R Core Team% Distributed under GPL 2 or later\name{normalizePath}\alias{normalizePath}\title{Express File Paths in Canonical Form}\description{Convert file paths to canonical form for the platform, to display themin a user-understandable form and so that relative and absolute paths canbe compared.}\usage{normalizePath(path, winslash = "\\\\", mustWork = NA)}\arguments{\item{path}{character vector of file paths.}\item{winslash}{the separator to be used on Windows -- ignoredelsewhere. Must be one of \code{c("/", "\\\\")}.}\item{mustWork}{logical: if \code{TRUE} then an error is given if the resultcannot be determined; if \code{NA} then a warning.}}\details{Tilde-expansion (see \code{\link{path.expand}}) is first done on\code{paths}.Where the Unix-alike platform supports it attempts to turn paths intoabsolute paths in their canonical form (no \samp{./}, \samp{../} norsymbolic links). It relies on the POSIX system function\code{realpath}: if the platform does not have that (we know of nocurrent example) then the result will be an absolute path but mightnot be canonical. Even where \code{realpath} is used the canonicalpath need not be unique, for example \emph{via} hard links ormultiple mounts.On Windows it converts relative paths to absolute paths, resolves symboliclinks, converts short names for path elements to long names and ensures theseparator is that specified by \code{winslash}. It will match each pathelement case-insensitively or case-sensitively as during the usual namelookup and return the canonical case. It relies on Windows API function\code{GetFinalPathNameByHandle} and in case of an error (such asinsufficient permissions) it currently falls back to the \R 3.6 (andolder) implementation, which relies on \code{GetFullPathName} and\code{GetLongPathName} with limitations described in the Notes section.An attempt is made not to introduce \abbr{UNC} paths in presence of mapped drivesor symbolic links: if \code{GetFinalPathNameByHandle} returns a \abbr{UNC} path,but \code{GetLongPathName} returns a path starting with a drive letter, Rfalls back to the \R 3.6 (and older) implementation.UTF-8-encoded paths not valid in the current locale can be used.\code{mustWork = FALSE} is useful for expressing paths for use inmessages.}\note{The canonical form of paths may not be what you expect. For example,on macOS absolute paths such as \file{/tmp} and \file{/var} aresymbolic links. On Linux, a path produced by bash process substitution isa symbolic link (such as \file{/proc/fd/63}) to a pipe and there is nocanonical form of such path. In \R 3.6 and older on Windows, symlinks willnot be resolved and the long names for path elements will be returned withthe case in which they are in \code{path}, which may not be canonical incase-insensitive folders.}\value{A character vector.If an input is not a real path the result is system-dependent (unless\code{mustWork = TRUE}, when this should be an error). It will beeither the corresponding input element or a transformation of it intoan absolute path.Converting to an absolute file path can fail for a large number ofreasons. The most common are\itemize{\item One of more components of the file path does not exist.\item A component before the last is not a directory, or there isinsufficient permission to read the directory.\item For a relative path, the current directory cannot bedetermined.\item A symbolic link points to a non-existent place or links form aloop.\item The canonicalized path would be exceed the maximum supportedlength of a file path.}}#ifdef windows\seealso{\code{\link{shortPathName}}}#endif\examples{\dontdiff{% random tempdircat(normalizePath(c(R.home(), tempdir())), sep = "\n")}}\keyword{ utilities }