blob: f68e938672fcb8525674c677223046b27655729a [file] [log] [blame]
% File src/library/base/man/tempfile.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2019 R Core Team
% Distributed under GPL 2 or later
\name{tempfile}
\alias{tempfile}
\alias{tempdir}
\title{Create Names for Temporary Files}
\description{
\code{tempfile} returns a vector of character strings which can be used as
names for temporary files.
}
\usage{% ../R/temp.R
tempfile(pattern = "file", tmpdir = tempdir(), fileext = "")
tempdir(check = FALSE)
}
\arguments{
\item{pattern}{a non-empty character vector giving the initial part
of the name.}
\item{tmpdir}{a non-empty character vector giving the directory name}
\item{fileext}{a non-empty character vector giving the file extension}
\item{check}{\code{\link{logical}} indicating if \code{tmpdir()}
should be checked and recreated if no longer valid.}
}
\value{
For \code{tempfile} a character vector giving the names of possible
(temporary) files. Note that no files are generated by \code{tempfile}.
For \code{tempdir}, the path of the per-session temporary directory.
On Windows, both will use a backslash as the path separator.
On a Unix-alike, the value will be an absolute path (unless
\code{tmpdir} is set to a relative path), but it need not be canonical
(see \code{\link{normalizePath}}) and on macOS it often is not.
}
\details{
The length of the result is the maximum of the lengths of the three
arguments; values of shorter arguments are recycled.
The names are very likely to be unique among calls to \code{tempfile}
in an \R session and across simultaneous \R sessions (unless
\code{tmpdir} is specified). The filenames are guaranteed not to be
currently in use.
The file name is made by concatenating the path given by
\code{tmpdir}, the \code{pattern} string, a random string in hex and
a suffix of \code{fileext}.
By default, \code{tmpdir} will be the directory given by
\code{tempdir()}. This will be a subdirectory of the per-session
temporary directory found by the following rule when the \R session is
started. The environment variables \env{TMPDIR}, \env{TMP} and
\env{TEMP} are checked in turn and the first found which points to a
writable directory is used:
#ifdef unix
if none succeeds \file{/tmp} is used. The path should not contain spaces.
#endif
#ifdef windows
if none succeeds the value of \env{R_USER} (see
\code{\link{Rconsole}}) is used. If the path to the directory
contains a space in any of the components, the path returned will use
the shortnames version of the path.
#endif
Note that setting any of these environment variables in the \R session
has no effect on \code{tempdir()}: the per-session temporary directory
is created before the interpreter is started.
}
\section{Note on parallel use}{
\R processes forked by functions such as \code{\link{mclapply}} and
\code{\link{makeForkCluster}} in package \pkg{parallel} share a
per-session temporary directory. Further, the \sQuote{guaranteed not
to be currently in use} applies only at the time of asking, and two
children could ask simultaneously. This is circumvented by ensuring
that \code{tempfile} calls in different children try different names.
}
\source{
The final component of \code{tempdir()} is created by the POSIX system
call \code{mkdtemp}, or if this is not available (e.g.\sspace{}on
Windows) a version derived from the source code of GNU \code{glibc}.
It will be of the form \file{RtmpXXXXXX} where the last 6 characters
are replaced in a platform-specific way. POSIX only requires that the
replacements be ASCII, which allows \code{.} (so the value may appear
to have a file extension) and \link{regexp} metacharacters such as
\code{+}. Most commonly the replacements are from the \link{regexp}
pattern \code{[A-Za-z0-9]}, but \code{.} \emph{has} been seen.
}
\references{
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988)
\emph{The New S Language}.
Wadsworth & Brooks/Cole.
}
\seealso{\code{\link{unlink}} for deleting files.}
\examples{\donttest{
tempfile(c("ab", "a b c")) # give file name with spaces in!
tempfile("plot", fileext = c(".ps", ".pdf"))
tempdir() # works on all platforms with a platform-dependent result
}
## Show how 'check' is working on some platforms:
if(exists("I'm brave") && `I'm brave` &&
identical(.Platform$OS.type, "unix") && grepl("^/tmp/", tempdir())) {
cat("Current tempdir(): ", tempdir(), "\n")
cat("Removing it :", file.remove(tempdir()),
"; dir.exists(tempdir()):", dir.exists(tempdir()), "\n")
cat("and now tempdir(check = TRUE) :", tempdir(check = TRUE),"\n")
}
}
\keyword{file}