不使用时导入文件(不再使用)

import file when not in use (any more)

我有一个供多个用户使用的 flexdashboard。他们读取、修改和写入相同的 (csv) 文件。我一直无法弄清楚如何使用 SQL 连接来执行此操作,所以与此同时(我需要一个可用的应用程序)我想使用一个简单的 .csv 文件作为数据库。这应该没问题,因为用户不太可能同时处理它,而且加载和写入整个文件几乎是即时的。

因此我的策略是:

1-加载文件,

2 次编辑(编辑是在 rhandsontable 中完成的,它被反向转换为数据帧)

3-保存: (a)-再次加载文件(以获取最新数据), (b)-附加来自 rhandsontable 的编辑并保留最新数据(由时间戳表示) (c)-write.csv

我想我应该在 (1) 中添加一些东西,这样它会检查文件是否已经在 use/open 中(因为另一个用户在 (3) 中)。所以:检查是否打开,如果不是-> 继续,否则-> sys.sleep(3) 再试一次。

关于如何在 R 中执行此操作的任何想法?在 Delphi 中,它会是这样的: if fileinuse(filename) then sleep(3) else df<-read.csv

R 方式是什么?

编辑:

我从我编辑过的答案开始,因为它更优雅。这使用 shell 命令来测试文件是否可用,如以下问题所述:

How to check in command-line if a given file or directory is locked (used by any process)?

这样可以避免加载和保存文件,因此效率更高。

# Function to test availability
IsInUse <- function(fName) {
  shell(paste("( type nul >> ", fName, " ) 2>nul && echo available || echo in use", sep=""), intern = TRUE)=="in use"
}

# Test availability
IsInUse("test.txt")

原回答:

有趣的问题!在尝试写入文件之前,我没有找到检查文件是否正在使用的方法。下面的解决方案远非优雅。它依赖于 tryCatch 函数,并通过读取和写入文件来检查它是否可用(这可能会很慢,具体取决于您的文件大小)。

# Function to check if the file is in use (relies on reading and writing which is inefficient)
IsInUse <- function(fName) {
  rData <- read.csv(fName)
  tryCatch(
    {
      write.csv(rData, file=fName, row.names = FALSE)
      return(FALSE)
    },
    error=function(cond) { 
      return(TRUE)
    }
  )
}

# Loop to check if file is in use
while(IsInUse(fName)) {
  print("Still in use")
  Sys.sleep(0.1)
}
# Your action here

我还发现这个问题的答案对理解 tryCatch 函数很有用 How to write trycatch in R

我很想知道是否还有其他人有更优雅的建议!

这个问题确实很有趣!想知道一个优雅的解决方案...