This is replacement for file.copy, but for one file at a time. The additional feature is that it will use robocopy (on Windows) or rsync on Linux or Mac, if they exist. It will default back to file.copy if none of these exists. If there is a possibility that the file already exists, then this function should be very fast as it will do "update only", i.e., nothing.

copySingleFile(
  from = NULL,
  to = NULL,
  useRobocopy = TRUE,
  overwrite = TRUE,
  delDestination = FALSE,
  create = TRUE,
  silent = FALSE
)

copyFile(
  from = NULL,
  to = NULL,
  useRobocopy = TRUE,
  overwrite = TRUE,
  delDestination = FALSE,
  create = TRUE,
  silent = FALSE
)

Arguments

from

The source file.

to

The new file.

useRobocopy

For Windows, this will use a system call to robocopy which appears to be much faster than the internal file.copy function. Uses /MIR flag. Default TRUE.

overwrite

Passed to file.copy

delDestination

Logical, whether the destination should have any files deleted, if they don't exist in the source. This is /purge for robocopy and --delete for rsync.

create

Passed to checkPath.

silent

Should a progress be printed.

Value

This function is called for its side effect, i.e., a file is copied from to to.

Author

Eliot McIntire and Alex Chubaty

Examples

tmpDirFrom <- file.path(tempdir(), "example_fileCopy_from")
tmpDirTo <- file.path(tempdir(), "example_fileCopy_to")
tmpFile1 <- tempfile("file1", tmpDirFrom, ".csv")
tmpFile2 <- tempfile("file2", tmpDirFrom, ".csv")
dir.create(tmpDirFrom, recursive = TRUE, showWarnings = FALSE)
dir.create(tmpDirTo, recursive = TRUE, showWarnings = FALSE)
f1 <- normalizePath(tmpFile1, mustWork = FALSE)
f2 <- normalizePath(tmpFile2, mustWork = FALSE)
t1 <- normalizePath(file.path(tmpDirTo, basename(tmpFile1)), mustWork = FALSE)
t2 <- normalizePath(file.path(tmpDirTo, basename(tmpFile2)), mustWork = FALSE)

write.csv(data.frame(a = 1:10, b = runif(10), c = letters[1:10]), f1)
write.csv(data.frame(c = 11:20, d = runif(10), e = letters[11:20]), f2)
copyFile(c(f1, f2), c(t1, t2))
#> /tmp/RtmpFPG633/example_fileCopy_from/file1245a1fa3e60d.csv 
#> "/tmp/RtmpFPG633/example_fileCopy_to/file1245a1fa3e60d.csv" 
#> /tmp/RtmpFPG633/example_fileCopy_from/file2245a5188a9cc.csv 
#> "/tmp/RtmpFPG633/example_fileCopy_to/file2245a5188a9cc.csv" 
file.exists(t1) ## TRUE
#> [1] TRUE
file.exists(t2) ## TRUE
#> [1] TRUE
identical(read.csv(f1), read.csv(f2)) ## FALSE
#> [1] FALSE
identical(read.csv(f1), read.csv(t1)) ## TRUE
#> [1] TRUE
identical(read.csv(f2), read.csv(t2)) ## TRUE
#> [1] TRUE