首先,请注意以下代码创建并删除当前目录中的文件夹。如果它与您的任何文件名冲突,请不要运行此代码。如果没有它,我不确定如何解释这个问题。
在fun1
我在一行上使用on.exit(..., add = TRUE)
,在下一行中,我尝试删除我用另一个on.exit
调用创建的目录。它没有用。
fun1 <- function(){
if(!file.exists("Rsaber")) dir.create("Rsaber")
on.exit(file.remove(paste0("Rsaber/", list.files("Rsaber"))), add = TRUE)
on.exit(file.remove("Rsaber"))
write.csv("1,2,3,4", file = "Rsaber/new.csv")
}
> fun1()
# Warning message:
# In file.remove("Rsaber") :
# cannot remove file 'Rsaber', reason 'Directory not empty'
> file.exists("Rsaber")
# [1] TRUE
> list.files("Rsaber")
# [1] "new.csv"
然而,这种方法有效。
fun2 <- function(){
if(!file.exists("Rsaber")) dir.create("Rsaber")
on.exit(file.remove(c(paste0("Rsaber/", list.files("Rsaber"))), "Rsaber"))
write.csv("1,2,3,4", file = "Rsaber/new.csv")
}
> fun2()
> file.exists("Rsaber")
# [1] FALSE
这第二种方法也更清晰,可能还有很长的路要走,但是
为什么on.exit(..., add = TRUE)
在 fun1
中按预期行事?
请注意,此处我没有使用临时目录,因为这是一个较大的函数的一部分,该函数具有用于确定是否保留下载的数据文件的逻辑参数。
系统信息:
> version[[1]]
# [1] "x86_64-pc-linux-gnu"
答案 0 :(得分:2)
我认为你需要add=TRUE
第二个file.remove
,否则第二个语句会取代第一个:
fun1 <- function(){
if(!file.exists("Rsaber")) dir.create("Rsaber")
on.exit(file.remove(paste0("Rsaber/", list.files("Rsaber"))))
on.exit(file.remove("Rsaber"), add = TRUE)
write.csv("1,2,3,4", file = "Rsaber/new.csv")
}
同样如上所述,这不会在Windows上工作,因为目录不会被视为文件。
对于跨平台支持,可以考虑unlink
fun1 <- function(){
if(!file.exists("Rsaber")) dir.create("Rsaber")
on.exit(unlink("Rsaber", recursive = TRUE))
write.csv("1,2,3,4", file = "Rsaber/new.csv")
print(system('ls'))
}