【发布时间】: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.test或file.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