【问题标题】:import file when not in use (any more)不使用时导入文件(不再使用)
【发布时间】:2018-10-31 07:54:17
【问题描述】:

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

因此,我的策略是:

1-加载文件,

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

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

我想我应该在 (1) 中添加一些内容,以便它检查文件是否尚未在使用/打开(因为其他用户在 (3)。所以:检查是否打开,如果没有 ->继续,else-> sys.sleep(3) 再试一次。

关于如何在 R 中执行此操作的任何想法?在德尔福它会是这样的: if fileinuse(filename) then sleep(3) else df

什么是 R 方式?

【问题讨论】:

    标签: r file-in-use


    【解决方案1】:

    编辑:

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

    我很想看看是否有人有更优雅的建议!

    【讨论】:

    • 感谢 MatAlf!与此同时,我可以使用它。我仍然希望有更优雅的解决方案,所以我还没有标记为“已回答”。
    • 我也尝试过使用:assertthat::is.writeable(path) 但无论文件是打开还是关闭都会给出“TRUE”:-(
    • 还有一件事:MatAff 提供的解决方案在 Windows 上运行良好,但是当 Rserver 在 linux 机器上运行时,应用程序会中断。一种选择是为 linux 重写,另一种是使用 try(catch 如下:counter
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-12-04
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 2013-11-07
      • 2019-11-30
      • 2020-08-01
      相关资源
      最近更新 更多