Usage
## S3 method for class 'default}(filename, path=NULL, FUN, ..., skip=FALSE, overwrite=FALSE, verbose=FALSE)':
createFileAtomicallyundefined
Creates a file atomically by first creating and writing to a temporary file which
is then renamed.
- filename
{The filename of the file to create.}
- path
{The path to the file.}
- FUN
{A function
that creates and writes to the pathname that
is passed as the first argument. This pathname is guaranteed
to be a non-existing temporary pathname.}
- ...
{Additional argumentes passed to pushTemporaryFile
()
and popTemporaryFile
().}
- skip
{If TRUE
and a file with the same pathname already exists,
nothing is done/written.}
- overwrite
{If TRUE
and a file with the same pathname
already exists, the existing file is overwritten.
This is also done atomically such that if the new file was not
successfully created, the already original file is restored.
If restoration also failed, the original file remains as
the pathname with suffix ".bak"
appended.}
- verbose
{A logical
or Verbose
.}
Returns (invisibly) the pathname.
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Create a file atomically
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
n <- 10;
createFileAtomically("foobar.txt", FUN=function(pathname) {
cat(file=pathname, "This file was created atomically.
");
cat(file=pathname, "Timestamp: ", as.character(Sys.time()), "
", sep="");
for (kk in 1:n) {
cat(file=pathname, kk, "
", append=TRUE);
Sys.sleep(0.1);
}
cat(file=pathname, "END OF FILE
", append=TRUE);
}, overwrite=TRUE)
bfr <- readLines("foobar.txt");
cat(bfr, sep="
");
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Overwrite the file atomically (emulate write failure)
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
tryCatch({
createFileAtomically("foobar.txt", FUN=function(pathname) {
cat(file=pathname, "Trying to create a new file.
");
cat(file=pathname, "Writing a bit, but then an error...
", append=TRUE);
# Emulate write error
stop("An error occured while writing to the new file.");
cat(file=pathname, "END OF FILE
", append=TRUE);
}, overwrite=TRUE)
}, error = function(ex) {
print(ex$message);
})
# The original file was never overwritten
bfr2 <- readLines("foobar.txt");
cat(bfr2, sep="
");
stopifnot(identical(bfr2, bfr));
# The partially temporary file remains
stopifnot(isFile("foobar.txt.tmp"));
bfr3 <- readLines("foobar.txt.tmp");
cat(bfr3, sep="
");
file.remove("foobar.txt.tmp");
[object Object]
Internally pushTemporaryFile
() and popTemporaryFile
() is used.
utilities
programming
IO