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

时间:2018-10-31 07:54:17

标签: r file-in-use

我有一个Flexdashboard,可供多个用户使用。他们读取,修改和写入相同(csv)文件。我还无法弄清楚如何使用SQL连接来完成此操作,因此与此同时(我需要一个运行中的应用程序)我想使用一个简单的.csv文件作为数据库。这应该很好,因为用户不太可能在同一时间处理它,并且加载和写入完整文件几乎是即时的。

因此,我的策略是:

1次加载文件,

2-edit(编辑是在rhandsontable中完成的,然后将其反向转换为数据框)

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

我想我应该在(1)中添加一些内容,以便它检查文件是否尚未使用/打开(因为其他用户位于(3)。所以:请检查是否打开,如果不是->继续,否则-> sys.sleep(3),然后重试。

关于如何在R中执行此操作的任何想法?在Delphi中,它将类似于: 如果fileinuse(filename)则sleep(3)否则df <-read.csv

R的方式是什么?

2 个答案:

答案 0 :(得分:0)

修改:

我从编辑后的答案开始,因为它更优雅。它将使用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

我还发现此问题的答案对How to write trycatch in R很有用,有助于理解tryCatch函数。

我想看看是否还有其他人提出更优雅的建议!

答案 1 :(得分:-1)

确实是一个有趣的问题!也对一个优雅的解决方案感到好奇...