Rev 85953 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
% File src/library/base/man/files.Rd% Part of the R package, https://www.R-project.org% Copyright 1995-2022 R Core Team% Distributed under GPL 2 or later\name{files}\alias{files}\alias{file.append}\alias{file.copy}\alias{file.create}\alias{file.exists}\alias{file.remove}\alias{file.rename}\alias{file.symlink}\alias{file.link}#ifdef windows\alias{Sys.junction}#endif\title{File Manipulation}\usage{file.create(\dots, showWarnings = TRUE)file.exists(\dots)file.remove(\dots)file.rename(from, to)file.append(file1, file2)file.copy(from, to, overwrite = recursive, recursive = FALSE,copy.mode = TRUE, copy.date = FALSE)file.symlink(from, to)file.link(from, to)#ifdef windowsSys.junction(from, to)#endif}\arguments{\item{\dots, file1, file2}{character vectors, containing file names or paths.}\item{from, to}{character vectors, containing file names or paths.For \code{file.copy} and \code{file.symlink}#ifdef windowsand \code{Sys.junction}#endif\code{to} can alternatively be the path to a single existing directory.}\item{overwrite}{logical; should existing destination files be overwritten?}\item{showWarnings}{logical; should the warnings on failure be shown?}\item{recursive}{logical. If \code{to} is a directory, shoulddirectories in \code{from} be copied (and their contents)? (Like\command{cp -R} on POSIX OSes.)}\item{copy.mode}{logical: should file permission bits be copied wherepossible?}\item{copy.date}{logical: should file dates be preserved wherepossible? See \code{\link{Sys.setFileTime}}.}}\description{These functions provide a low-level interface to the computer'sfile system.}\details{The \code{\dots} arguments are concatenated to form one characterstring: you can specify the files separately or as one vector. All ofthese functions expand path names: see\code{\link{path.expand}}. (\code{file.exists} silently reports falsefor paths that would be too long after expansion: the rest will give awarning.)\code{file.create} creates files with the given names if they do notalready exist and truncates them if they do. They are created withthe maximal read/write permissions allowed by the\sQuote{\link{umask}} setting (where relevant). By default a warningis given (with the reason) if the operation fails.\code{file.exists} returns a logical vector indicating whether thefiles named by its argument exist. (Here \sQuote{exists} is in thesense of the system's \code{stat} call: a file will be reported asexisting only if you have the permissions needed by \code{stat}.Existence can also be checked by \code{\link{file.access}}, whichmight use different permissions and so obtain a different result.Note that the existence of a file does not imply that it is readable:for that use \code{\link{file.access}}.) What constitutes a\sQuote{file} is system-dependent, but should include directories.(However, directory names must not include a trailing backslash orslash on Windows.) Note that if the file is a symbolic link on aUnix-alike, the result indicates if the link points to an actual file,not just if the link exists. On Windows, the result is unreliable for abroken symbolic link (junction).Lastly, note the \emph{different} function \code{\link{exists}} whichchecks for existence of \R objects.\code{file.remove} attempts to remove the files named in its argument.On most Unix platforms \sQuote{file} includes \emph{empty}directories, symbolic links, \I{fifo}s and sockets. On Windows,\sQuote{file} means a regular file and not, say, an empty directory.\code{file.rename} attempts to rename files (and \code{from} and\code{to} must be of the same length). Where file permissions allowthis will overwrite an existing element of \code{to}. This is subjectto the limitations of the OS's corresponding system call (seesomething like \command{man 2 rename} on a Unix-alike): in particularin the interpretation of \sQuote{file}: most platforms will not renamefiles from one file system to another. \strong{NB:} This means thatrenaming a file from a temporary directory to the user's filespace orduring package installation will often fail. (On Windows,\code{file.rename} can rename files but not directories acrossvolumes.) On platforms which allow directories to be renamed,typically neither or both of \code{from} and \code{to} must adirectory, and if \code{to} exists it must be an empty directory.\code{file.append} attempts to append the files named by itssecond argument to those named by its first. The \R subscriptrecycling rule is used to align names given in vectorsof different lengths.\code{file.copy} works in a similar way to \code{file.append} but withthe arguments in the natural order for copying. Copying to existingdestination files is skipped unless \code{overwrite = TRUE}. The\code{to} argument can specify a single existing directory. If\code{copy.mode = TRUE} file read/write/execute permissions are copiedwhere possible, restricted by \sQuote{\link{umask}}. (On Windows thisapplies only to files.) Other security attributes such as \abbr{ACL}s are notcopied. On a POSIX filesystem the targets of symbolic links will becopied rather than the links themselves, and hard links are copiedseparately. Using \code{copy.date = TRUE} may or may not copy thetimestamp exactly (for example, fractional seconds may be omitted),but is more likely to do so as from \R 3.4.0.\code{file.symlink} and \code{file.link} make symbolic and hard linkson those file systems which support them. For \code{file.symlink} the\code{to} argument can specify a single existing directory. (Unix andmacOS native filesystems support both. Windows has hard links tofiles on \abbr{NTFS} file systems and concepts related to symbolic links onrecent versions: see the section below on the Windows version of thishelp page. What happens on a FAT or \abbr{SMB}-mounted file system is OS-specific.)File arguments with a marked encoding (see \code{\link{Encoding}} areif possible translated to the native encoding, except on Windows whereUnicode file operations are used (so marking as UTF-8 can be used toaccess file paths not in the native encoding on suitable filesystems).}\value{These functions return a logical vector indicating whichoperation succeeded for each of the files attempted. Using a missingvalue for a file or path name will always be regarded as a failure.If \code{showWarnings = TRUE}, \code{file.create} will give a warningfor an unexpected failure.}\section{Case-insensitive file systems}{Case-insensitive file systems are the norm on Windows and macOS,but can be found on all OSes (for example a FAT-formatted USB drive isprobably case-insensitive).These functions will most likely match existing files regardless of caseon such file systems: however this is an OS function and it ispossible that file names might be mapped to upper or lower case.}#ifdef windows\note{There is no guarantee that these functions will handle Windowsrelative paths of the form \file{d:path}: try \file{d:./path}instead. In particular, \file{d:} is not recognized as a directory.Nor are \samp{\\\\?\\} prefixes (and similar) supported.Most of these functions accept UTF-8 filepaths not valid in thecurrent locale.User error in supplying invalid file names (and note that \file{foo/}and \file{foo\\} \emph{are} invalid on Windows) has undefined consequences.}\section{Symbolic links on Windows}{ Symbolic links in the sense ofPOSIX file systems do not exist on Windows: however, \abbr{NTFS} file systemssupport two similar concepts.There are \sQuote{junctions} (or \sQuote{junction points}),unfortunately without a public API: a Windows version of the Unixconcept of mounting one directory on another. A junction can linkdirectories located on the same or different local volumes of the samecomputer, but cannot link to a network drive. Function\code{Sys.junction} creates one or more junctions: \code{to} shouldeither specify a single existing directory or a set of non-existentfile paths of the same length as \code{from}. (Command\command{mklink /J} can also be used to create junctions.)A version of symbolic linking to files/directories was implementedmore recently, and \code{file.symlink} makes use of that interface.However, it has restrictions which are crippling. First, the userneeds permission to make symbolic links, and that permission is notnormally granted except to Administrator accounts (note: not userswith Administrator rights): further many users report that whereas thePolicy Editor appears to be able to grant such rights, the API stillreports insufficient permissions. Second, the interface needs to knowif \code{from} is a file or a directory (and it need not yet exist):we have implemented this to allow linking from a directory only if itcurrently exists.Care is needed with removing a junction (and most likely also asymbolic link): many tools will remove the target and its contents.}#endif\section{Warning}{Always check the return value of these functions when used in packagecode. This is especially important for \code{file.rename}, which hasOS-specific restrictions (and note that the session temporarydirectory is commonly on a different file system from the workingdirectory): it is only portable to use \code{file.rename} to changefile name(s) within a single directory.}\author{Ross Ihaka, Brian Ripley}\seealso{\code{\link{file.info}}, \code{\link{file.access}}, \code{\link{file.path}},\code{\link{file.show}}, \code{\link{list.files}},\code{\link{unlink}}, \code{\link{basename}},\code{\link{path.expand}}.\code{\link{dir.create}}.\code{\link{Sys.glob}} to expand wildcards in file specifications.\code{\link{file_test}}, \code{\link{Sys.readlink}} (for \sQuote{symlink}s).\url{https://en.wikipedia.org/wiki/Hard_link} and\url{https://en.wikipedia.org/wiki/Symbolic_link} for the concepts oflinks and their limitations.}\examples{\dontshow{oldwd <- setwd(tempdir())}cat("file A\n", file = "A")cat("file B\n", file = "B")file.append("A", "B")file.create("A") # (trashing previous)file.append("A", rep("B", 10))if(interactive()) file.show("A") # -> the 10 lines from 'B'file.copy("A", "C")dir.create("tmp")file.copy(c("A", "B"), "tmp")list.files("tmp") # -> "A" and "B"#ifdef unixsetwd("tmp")file.remove("A") # the tmp/A filefile.symlink(file.path("..", c("A", "B")), ".")# |--> (TRUE,FALSE) : ok for A but not B as it exists alreadysetwd("..")#endifunlink("tmp", recursive = TRUE)file.remove("A", "B", "C")\dontshow{setwd(oldwd)}}\keyword{file}