如何防止覆盖文件?

Mar*_*rek 6 file-io r

我正在寻找一种方法来阻止R在会话期间覆盖文件.更通用的解决方案则更好.

目前,我得到了一堆的函数调用如:safe.save,safe.png,safe.write.table这是实现或多或少地

safe.smth <- function(..., file) {
    if (file.exists(file))
        stop("File exists!")
    else
        smth(..., file=file)
}
Run Code Online (Sandbox Code Playgroud)

它有效,但只有我控制执行.如果某些(不是我的)函数创建了文件,我就无法阻止它被覆盖.

另一种方法是在文件上设置只读标志,这也是覆盖现有文件的前R.但这也有缺点(例如:您不知道哪些文件需要保护).
或者写一行:

protect <- function(p) if (file.exists(p)) stop("File exsits!") else p
Run Code Online (Sandbox Code Playgroud)

并在提供文件名时始终使用它.

有没有办法强制这种行为会话?连接的某种全局设置?也许只是功能的子集(图形​​设备,file创建的连接等)?也许某些系统特定的解决方

以下内容可用作测试用例:

test <- function(i) {
    try(write.table(i, "test_001.csv"))
    try(writeLines(as.character(i), "test_002.txt"))
    try({png("test_003.png");plot(i);dev.off()})
    try({pdf("test_004.pdf");plot(i);dev.off()})
    try(save(i, file="test_005.RData"))
    try({f<-file("test_006.txt", "w");cat(as.character(i), file=f);close(f)})
}
test(1)
magic_incantations() # or magic_incantations(test(2)), etc.
test(2) # should fail on all writes (to test set read-only to files from first call)
Run Code Online (Sandbox Code Playgroud)

mob*_*mob 0

避免破坏数据文件的传统方法不是寻找操作系统黑客,而是使用会话专用的文件名和目录。

session.dir <- tempdir()
...
write.table(i, file.path(session.dir,"test_001.csv"))
writeLines(as.character(i), file.path(session.dir,"test_002.txt"))
...
Run Code Online (Sandbox Code Playgroud)

或者

session.pid <- Sys.getpid()
...
write.table(i, paste0("test_001.",session.pid,".csv"))
writeLines(as.character(i), paste0("test_002.",session.pid,".txt"))
...
Run Code Online (Sandbox Code Playgroud)