file.create(…, showWarnings = TRUE)
file.exists(…)
file.remove(…)
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)
Sys.junction(from, to)
file.copy
and file.symlink
and Sys.junction
to
can alternatively be the path to a single existing directory.to
is a directory, should
directories in from
be copied (and their contents)? (Like
cp -R
on POSIX OSes.)Sys.setFileTime
.showWarnings = TRUE
, file.create
will give a warning
for an unexpected failure.junction.exe
from
https://download.sysinternals.com/files/Junction.zip (see
https://technet.microsoft.com/en-us/sysinternals/bb896768). On
recent enough versions of Windows mklink /J
can also be
used. Function Sys.junction
creates one or more junctions:
to
should either specify a single existing directory or a set
of non-existent file paths of the same length as from
. A version of symbolic linking to files/directories was implemented
starting with Vista, and file.symlink
makes use of that
interface. However, it has restrictions (apart from the OS version
restriction) which are crippling. First, the user needs permission to
make symbolic links, and that permission is not normally granted
except to Administrator accounts (note: not users with Administrator
rights): further many users report that whereas the Policy Editor
appears to be able to grant such rights, the API still reports
insufficient permissions. Second, the interface needs to know if
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 it
currently exists. Prior to R 3.0.3 the paths had to use backslashes
(an undocumented restriction of the Windows system call). Care is needed with removing a junction (and most likely also a
symbolic link): many tools will remove the target and its contents.file.rename
, which has
OS-specific restrictions (and note that the session temporary
directory is commonly on a different file system from the working
directory).…
arguments are concatenated to form one character
string: you can specify the files separately or as one vector.
All of these functions expand path names: see path.expand
. file.create
creates files with the given names if they do not
already exist and truncates them if they do. They are created with
the maximal read/write permissions allowed by the
‘umask’ setting (where relevant). By default a warning
is given (with the reason) if the operation fails. file.exists
returns a logical vector indicating whether the
files named by its argument exist. (Here ‘exists’ is in the
sense of the system's stat
call: a file will be reported as
existing only if you have the permissions needed by stat
.
Existence can also be checked by file.access
, which
might 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 file.access
.) What constitutes a
‘file’ is system-dependent, but should include directories.
(However, directory names must not include a trailing backslash or
slash on Windows.) Note that if the file is a symbolic link on a
Unix-alike, the result indicates if the link points to an actual file,
not just if the link exists.
Lastly, note the different function exists
which
checks for existence of R objects. file.remove
attempts to remove the files named in its argument.
On most Unix platforms ‘file’ includes empty
directories, symbolic links, fifos and sockets. On Windows,
‘file’ means a regular file and not, say, an empty directory. file.rename
attempts to rename files (and from
and
to
must be of the same length). Where file permissions allow
this will overwrite an existing element of to
. This is subject
to the limitations of the OS's corresponding system call (see
something like man 2 rename
on a Unix-alike): in particular
in the interpretation of ‘file’: most platforms will not rename
files across file systems. (On Windows, file.rename
can move
files but not directories between volumes.) On platforms which allow
directories to be renamed, typically neither or both of from
and to
must a directory, and if to
exists it must be an
empty directory. file.append
attempts to append the files named by its
second argument to those named by its first. The R subscript
recycling rule is used to align names given in vectors
of different lengths. file.copy
works in a similar way to file.append
but with
the arguments in the natural order for copying. Copying to existing
destination files is skipped unless overwrite = TRUE
. The
to
argument can specify a single existing directory. If
copy.mode = TRUE
file read/write/execute permissions are copied
where possible, restricted by ‘umask’. (On Windows this
applies only to files.) Other security attributes such as ACLs are not
copied. On a POSIX filesystem the targets of symbolic links will be
copied rather than the links themselves, and hard links are copied
separately. Using copy.date = TRUE
may or may not copy the
timestamp exactly: for example, fractional seconds may be omitted. file.symlink
and file.link
make symbolic and hard links
on those file systems which support them. For file.symlink
the
to
argument can specify a single existing directory. (Unix and
macOS native filesystems support both. Windows has hard links to
files on NTFS file systems and concepts related to symbolic links on
recent versions: see the section below on the Windows version of this
help page. What happens on a FAT or SMB-mounted file system is OS-specific.)file.info
, file.access
, file.path
,
file.show
, list.files
,
unlink
, basename
,
path.expand
. dir.create
. Sys.glob
to expand wildcards in file specifications. file_test
, Sys.readlink
(for ‘symlink’s). https://en.wikipedia.org/wiki/Hard_link and
https://en.wikipedia.org/wiki/Symbolic_link for the concepts of
links and their limitations.cat("file A\n", file = "A")
cat("file B\n", file = "B")
file.append("A", "B")
file.create("A")
file.append("A", rep("B", 10))
if(interactive()) file.show("A")
file.copy("A", "C")
dir.create("tmp")
file.copy(c("A", "B"), "tmp")
list.files("tmp")
setwd("tmp")
file.remove("B")
file.symlink(file.path("..", c("A", "B")), ".")
setwd("..")
unlink("tmp", recursive = TRUE)
file.remove("A", "B", "C")
Run the code above in your browser using DataLab