如何在R中检查文件是否已打开或已关闭

3
我想问一下,在R编程中,如何在读取文件之前检查文件的状态(是否已打开或关闭)?
我尝试了myfile = open(filenames),但它没有起作用。
3个回答

6

我认为关键是使用open = "w"进行写入打开。这对我来说似乎完美地起作用:

file.opened <- function(path) {
  suppressWarnings(
    "try-error" %in% class(
      try(file(path, 
               open = "w"), 
          silent = TRUE
      )
    )
  )
}

打开Excel文件后:
file.opened("C:\\Folder\\tbl1.xlsx")
# TRUE

当我关闭它时:

file.opened("C:\\Folder\\tbl1.xlsx")
# FALSE

2
当我运行这个函数时,它会破坏Excel文件。有时候在使用一两次后,我仍然能够打开文件,但如果继续使用,问题就会发生。尝试使用Excel打开它会显示“文件格式或文件扩展名无效”,而使用openxlsx::read.xlsx()则会显示:“Error in file(con, "r") : invalid 'description' argument In addition: Warning message: In unzip(xlsxFile, exdir = xmlDir) : error 1 in extracting from zip file”。 - NotReallyHere12
很奇怪,我从来没有遇到过这个问题。你在任何Excel文件中都会遇到这个问题吗? - MS Berends
是的,即使是我刚创建的空文件也是如此。我正在使用 Excel 365。 - NotReallyHere12
注意:目前这段代码在检查时总是会破坏文件。可能是版本问题。我差点丢失了非常关键的数据。 - Delta._.43
file(path, open = "w") 似乎会用一个空文件来覆盖已存在的文件。而file(path, open = "r+")会尝试写入文件,但事实上并不写入任何内容(即保留已有数据)。请参阅 ?file 中的模式部分。 - vorpal

0

当您使用函数file时,将返回到文件的连接:

con <- file(description="path/to/file", ...)

您可以使用isOpen函数来检查它是否打开,该函数将返回一个逻辑值(TRUEFALSENA)。
如果您在R会话中没有connection,或者连接已被删除,则连接将关闭: ?file的摘录:
 ‘close’ closes and destroys a connection.  This will happen
 automatically in due course (with a warning) if there is no longer
 an R object referring to the connection.

文件连接可以使用openclose分别打开和关闭。


基本上你想使用 file 而不是 open :) - Scott Ritchie
2
我尝试使用MS-Word文档,但它没有起作用。无论文档是否打开,isOpen都返回FALSE。 - Dan Chaltiel
@DanChaltiel isOpen 不会检查文件是否在任何应用程序中打开,它检查特定连接是否在 R 中打开,例如在上面的情况下,是 con 变量。 - Scott Ritchie
2
通常情况下,您无法检查文件是否在另一个程序中打开。请参阅 https://dev59.com/HnI-5IYBdhLWcg3wPF12 以获取有关此问题的一些讨论。 - Scott Ritchie

0
对于 Excel 文件,我使用了以下方法,在我的电脑上可以正常工作:将 Excel 文件重命名为其名称。如果 Excel 文件已打开,则返回 FALSE。如果 Excel 文件已关闭,则返回 TRUE。
file.rename(from = "C:/Users/xxx/Desktop/Test file access/file1.xlsx",
            to = "C:/Users/xxx/Desktop/Test file access/file1.xlsx")

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