【发布时间】:2012-01-19 05:06:27
【问题描述】:
如果我这样做
rm_rf('somewhere')
mkdir('somewhere')
mkdir 每隔一段时间就会抛出一个Permission Denined。这是因为rm_rf 异步运行,有时在mkdir 运行之前还没有完成删除目录?
如何让它在完成删除之前阻塞?
顺便说一句,在 Windows 上运行。
谢谢
【问题讨论】:
如果我这样做
rm_rf('somewhere')
mkdir('somewhere')
mkdir 每隔一段时间就会抛出一个Permission Denined。这是因为rm_rf 异步运行,有时在mkdir 运行之前还没有完成删除目录?
如何让它在完成删除之前阻塞?
顺便说一句,在 Windows 上运行。
谢谢
【问题讨论】:
我也遇到了这个错误,并首先将其重命名为解决方法:
build_dir.directory? &&
build_dir.rename(old_build_dir) &&
FileUtils.rm_rf(old_build_dir)
build_dir.mkdir
(build_dir 和 old_build_dir 是 Pathname 对象)
不完美,但比随机的sleep 更好。
【讨论】:
听起来像是 NTFS 的一个功能,见Microsoft Suppport:
此文件处于待删除状态。该文件已 已删除,但仍有打开的句柄。 NTFS 将等到 在更新索引之前,此文件的所有句柄都已关闭。如果 尝试访问该文件,但是,NTFS 将拒绝 试图。因为该文件在索引中列出,但实际上是 已删除,您可以看到该文件,但无法访问它。
看看解决方案,我认为除了等待和重试之外没有什么可做的。
【讨论】:
rm_rf 是同步的,与任何其他常用的 ruby 方法一样。
如果不是,那么您可能会收到 Errno::EEXIST 错误,但您会收到“权限被拒绝”。
作为一种解决方法,尝试在rm_rf 和mkdir 之间插入小延迟,例如sleep(0.1)
【讨论】: