Appends a temporary suffix to the pathname and, optionally, renames an existing file accordingly.

In combination with popTemporaryFile(), this method is useful for creating a file/writing data to file atomically, by first writing to a temporary file which is the renamed. If for some reason the generation of the file was interrupted, for instance by a user interrupt or a power failure, then it is only the temporary file that is incomplete.

# S3 method for default
pushTemporaryFile(filename, path=NULL, suffix=".tmp", isFile=FALSE, ..., verbose=FALSE)

Arguments

filename

The filename of the file.

path

The path of the file.

suffix

The suffix to be appended.

isFile

If TRUE, the file must exist and will be renamed on the file system. If FALSE, it is only the pathname string that will be modified. For details, see below.

...

Not used.

verbose

A logical or Verbose.

Value

Returns the pathname with the suffix appended.

Details

If isFile is FALSE, the pathname where the suffix of the temporary pathname has been added is returned. If isFile is TRUE, the file is also renamed. Then, if the file does not exists or it was not successfully renamed, an exception is thrown.

Author

Henrik Bengtsson

See also

Examples


createAtomically <- function(pathname, ...) {
  cat("Pathname: ", pathname, "\n", sep="");

  # Generate a file atomically, i.e. the file will either be
  # complete or not created at all.  If interrupted while
  # writing, only a temporary file will exist/remain.
  pathnameT <- pushTemporaryFile(pathname);
  cat("Temporary pathname: ", pathnameT, "\n", sep="");

  cat(file=pathnameT, "This file was created atomically:\n");
  for (kk in 1:10) {
    cat(file=pathnameT, kk, "\n", append=TRUE);
    # Emulate a slow process
    if (interactive()) Sys.sleep(0.1)
  }
  cat(file=pathnameT, "END OF FILE\n", append=TRUE);

  # Rename the temporary file
  pathname <- popTemporaryFile(pathnameT);

  pathname;
} # createAtomically()


pathname <- tempfile();

tryCatch({
  # Try to interrupt the process while writing...
  pathname <- createAtomically(pathname);
}, interrupt=function(intr) {
  str(intr);
})
#> Pathname: /tmp/henrik/RtmpAr1qq8/file231396ac6c5c6
#> Temporary pathname: /tmp/henrik/RtmpAr1qq8/file231396ac6c5c6.tmp

# ...and this will throw an exception
bfr <- readLines(pathname);
cat(bfr, sep="\n");
#> This file was created atomically:
#> 1 
#> 2 
#> 3 
#> 4 
#> 5 
#> 6 
#> 7 
#> 8 
#> 9 
#> 10 
#> END OF FILE