【问题标题】:Access permissions to file system objects in Windows via R通过 R 访问 Windows 中文件系统对象的权限
【发布时间】:2014-07-09 09:30:37
【问题描述】:

似乎有时在 Windows 中访问文件时,需要时间来给出成功/失败的答案,但 R 脚本不会等待并假设失败。

要理解我的意思,请考虑以下几行:

is.path=function(path){
    path=sub("/$", "", path)
    file.exists(path)
}
delete=function(x){
    unlink(x,recursive=TRUE)
    if(is.path(x)) stop("\nUnable to access\n", x)
}

delete("foo")

删除 FS 对象后,我们检查操作是否成功。如果foo 是完全免费的,它就像一个魅力。考虑foo 是作为资源管理器窗口打开的文件夹的情况。删除也会成功导致窗口关闭或指向父窗口。

我们用户察觉不到这种协商,但 R 不会等待并触发 stop

一种非常简单的修复方法是在unlink 之后添加延迟,例如Sys.sleep(1)。显然,如果我设置一个短暂的延迟,它将不适用于所有情况,而对于标准更频繁的情况,长时间的延迟将是低效的。

你能帮我找到一个聪明的解决方案吗?

【问题讨论】:

  • unlink 在获得状态之前不会返回。现在,Windows 很可能已经够草率了,以至于它没有进行适当的“刷新”,因此认为该文件仍然存在,只要它对file.exists 的响应就可以了。我相当怀疑时间延迟是否会奏效。您将需要相当于“刷新”调用。也许尝试file.testfile.access 看看他们是否强制正确刷新 Windows 状态。
  • @CarlWitthoft: unlink 可能是使用RemoveDirectory 实现的,一旦目录的删除被批准但在实际发生之前,它将(在某些情况下,如记录的那样)返回成功。跨度>
  • 有一个众所周知但略有不同的问题,即删除目录树有时会任意失败;在这种情况下,两次移除树似乎总是有效的。建议您尝试连续两次发出unlink,看看问题是否仍然存在。
  • 否则,唯一明智的选择可能是循环中的短暂延迟。 Exit the loop once is.path(x) returns false, or after the total delay exceeds a suitably chosen timeout value.
  • 只有Sys.sleep 对我有用(我假设对其他所有人)

标签: windows r filesystems file-permissions


【解决方案1】:

我最好的尝试只是这种聪明的睡眠,它只在必要时触发以避免不必要的延迟。

is.path=function(path){
    path=sub("/$", "", path)
    file.exists(path)
}
delete=function(x){
    unlink(x,recursive=TRUE)
    if(is.path(x)) {
        Sys.sleep(1.5)
        if(is.path(x)) stop("\nUnable to access\n", x)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 2017-03-23
    • 2012-02-06
    相关资源
    最近更新 更多