删除临时文件

18

我看了一篇关于如何删除临时文件的文章。那篇文章中提供的解决方案是:

do.call(file.remove, list(list.files("C:/Temp", full.names = TRUE)))

目录"C:/Temp"在Windows机器上应该是正常的。由于我使用的是Linux系统,所以我不确定我的临时文件目录是什么,因此我执行了以下操作:

tmp <- tempfile()

这段代码的输出结果是:"/tmp/RtmpNS80no/file147c37e54e8e"

于是,我尝试了以下代码:

do.call(file.remove, list(list.files("tmp", full.names = TRUE)))

这返回“logical(0)”,所以可能没有起作用?

如何删除所有的临时文件?


list.files("tmp", full.names = TRUE) 是什么意思? - Remko Duursma
list.files 中的目录位置是相对于您当前的工作目录,因此您需要完整拼写出它,或者确保您在 tmp 目录的上一级目录中。也许您在 list.files 调用中还需要使用 recursive=TRUE - Andrew Gustar
2
tempfile() gives you a file path for a temporary file in your temp file directory. The temp directory location for your R session is found with tempdir(). the temp directory can be compute with basename(tempdir()) - cderv
dirname(tempdir()) 而不是 basename。抱歉。 - cderv
4个回答

31

您可以获取当前R会话的临时目录。多次调用时不会更改。

tmp_dir <- tempdir()
tmp_dir
#> [1] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh"
tempdir()
#> [1] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh"

临时目录包含当前R会话的临时文件和目录

list.files(tmp_dir)
#> [1] "file16dc20539ab"  "file16dc4ad71f"   "file16dc5bab1716"
#> [4] "file16dc74d65663"

会话临时目录位于系统的临时目录中。如果您想删除系统临时目录中的所有内容(不建议这样做,因为它是针对整个系统而不仅仅是R临时文件的),可以使用此路径。
dirname(tmp_dir)
#> [1] "C:/Users/chris/AppData/Local/Temp"

这个路径也包含在操作系统的环境变量中。(显然,我是在Windows上)

Sys.getenv("TEMP")
#> [1] "C:\\Users\\chris\\AppData\\Local\\Temp"
shell("echo %TMP%", intern = T) # command line from R on windows
#> [1] "C:\\Users\\chris\\AppData\\Local\\Temp"

tempfile() 函数返回一个可能的临时文件路径,默认情况下在 tempdir() 目录中,没有文件扩展名。该文件不会被创建,每次调用 tempfile 时都会返回不同的值。

tmp_file <- tempfile()
tmp_file
#> [1] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh\\file16dc202636f"
file.exists(tmp_file)
#> [1] FALSE

tempfile() # new file path when called again
#> [1] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh\\file16dc72594e58"

我们可以将一些内容写入到tmp_file中。
# file is created by writeLines if it does not exist (this is the case here)
writeLines("This is a temp file", con = tmp_file)
file.exists(tmp_file)
#> [1] TRUE

我们可以从这个文件中读取数据。
readLines(tmp_file)
#> [1] "This is a temp file"

现在如果您想删除这个文件。
file.remove(tmp_file)
#> [1] TRUE
file.exists(tmp_file)
#> [1] FALSE

如果您想删除R会话临时文件夹中的所有文件,可以在文件列表上使用file.remove。为此示例目的,我删除了以“file”开头的所有临时文件("^file"是该模式的正则表达式)。比我创建的还要多- R会话似乎会按照某种方式创建一些临时文件。
files <- list.files(tmp_dir, full.names = T, pattern = "^file")
files
#>  [1] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh/file16dc1a6a6e15"
#>  [2] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh/file16dc1ff572fc"
#>  [3] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh/file16dc20539ab" 
#>  [4] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh/file16dc2e2227b8"
#>  [5] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh/file16dc4ad71f"  
#>  [6] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh/file16dc513c35b6"
#>  [7] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh/file16dc570a473f"
#>  [8] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh/file16dc5bab1716"
#>  [9] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh/file16dc6e102bd4"
#> [10] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh/file16dc6f253f90"
#> [11] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh/file16dc74d65663"
file.remove(files)
#> Warning in file.remove(files): impossible d'effacer le fichier 'C:
#> \Users\chris\AppData\Local\Temp\RtmpmusYkh/file16dc1ff572fc', à cause de
#> 'Permission denied'
#>  [1]  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE

我收到了一个警告,因为有一个文件无法删除(可能正在被R使用)

如果你想要删除一个文件夹,你也可以使用unlink

# create a new directory under tempdir
dir.create(dir1 <- file.path(tempdir(), "testdir"))
# create 2 file under this new directory
file.create(file1 <- tempfile(tmpdir = dir1))
#> [1] TRUE
file.create(file2 <- tempfile(tmpdir = dir1))
#> [1] TRUE
file1
#> [1] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh/testdir\\file16dc26b5cb7"
file2
#> [1] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh/testdir\\file16dc2b0816fe"
list.files(dir1, full.names = T)
#> [1] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh/testdir/file16dc26b5cb7" 
#> [2] "C:\\Users\\chris\\AppData\\Local\\Temp\\RtmpmusYkh/testdir/file16dc2b0816fe"

# we can delete the all directory with `unlink`. It deletes also the directory
unlink(dir1, recursive = T)
dir.exists(dir1)
#> [1] FALSE

1
这很棒。只要小心不要执行 unlink(tempdir()),它会清除当前 R 会话的所有临时文件并导致糟糕的事情发生。 - OliE

3
在花费数小时寻找如何使用命令提示符来删除旧文件和文件夹后,我写了这个 R 脚本。 我肯定会自动化地运行它每周一次:
#Windows Environmental variable %USERPROFILE%\AppData\Local\Temp
PCTempDir <- Sys.getenv("TEMP")

#detect and delete folders with pattern "Rtmp"
folders <- dir(PCTempDir, pattern = "Rtmp", full.names = TRUE)
unlink(folders, recursive = TRUE, force = TRUE, expand = TRUE)

这将删除计算机上执行 R 脚本后留下的 Rtmp* 文件夹及其中的文件,我电脑里有很多这样的文件夹。
当然,这类脚本也可以扩展至其他文件夹。

3
这里有一个非常简单的方法。
unlink(paste0(normalizePath(tempdir()), "/", dir(tempdir())), recursive = TRUE)

确认它起作用了

dir(tempdir())
# character(0)

1
被接受的解决方案假设有一个唯一的临时目录。
然而,有几个软件包可能会使用特定的临时目录来运行它们的任务。一个典型的行为(例如devtools)是在任务成功完成时清理杂乱无用的文件,但在出现错误时留下临时文件,以便用户检查日志文件等。当你处理它们时,你的硬盘会充满了微小的临时目录,手动删除它们是不切实际的。
tdirs <- Sys.glob(file.path(dirname(tempdir()), "Rtmp*"))
print(tdirs)  # Perhaps check before deleting 
names(which(sapply(tdirs[! tdirs %in% tempdir()], unlink, recursive = TRUE) != 0))

以上代码中,我使用tempdir()的父目录和Rtmp前缀来确定临时文件夹的位置。
最后一行返回无法删除的目录(很可能被操作系统锁定)。
[! tdirs %in% tempdir()]保留主会话目录,以避免重新启动R。
在Linux上测试过。

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