如何防止文件被覆盖?

6
我正在寻找一种方法来防止R在会话期间覆盖文件。通用解决方案更好。
目前,我有一堆被称为safe.save、safe.png、safe.write.table等函数,它们的实现大致如下:
safe.smth <- function(..., file) {
    if (file.exists(file))
        stop("File exists!")
    else
        smth(..., file=file)
}

它可以工作,但仅在我控制执行时。如果某些(不是我的)函数创建文件,我无法阻止它覆盖。

另一种方法是在文件上设置只读标志,这也可以防止R覆盖现有文件。但是这也有缺点(例如:您不知道哪些文件需要受到保护)。
或者编写一行代码:

protect <- function(p) if (file.exists(p)) stop("File exsits!") else p

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

有没有一种方法可以强制会话范围内的这种行为?是否有连接的全局设置?也许只针对某些函数(图形设备,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)

你使用的是哪个操作系统? - Thomas
@Thomas Win7。但如果您有其他针对特定操作系统的方式,我很乐意了解。 - Marek
你想创建一个新文件,还是“追加”选项可以接受?另外,在*nix下,不是有一个“set noclobber”命令或类似的命令吗? - Carl Witthoft
@CarlWitthoft 新建文件。此外,我无法想象在不造成混乱的情况下将内容附加到png/RData/csv文件中。我会检查这个*nix解决方案。 - Marek
@CarlWitthoft set noclobber 只能防止 bash 重定向(例如 >)的覆盖,所以在这里没有运气。 - Marek
1个回答

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"))
...

或者

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接