在Python中运行shutil.rmtree(d)后,权限被拒绝执行os.mkdir(d)

在Python中运行shutil.rmtree(d)后,权限被拒绝执行os.mkdir(d),python,io,shutil,Python,Io,Shutil,通常在Windows7控制台中,如果我非常快地运行python程序两次,那么 if os.path.isdir(d): shutil.rmtree(d) if not os.path.exists(d): os.mkdir(d) 其中d是包含许多文件的目录的名称,我得到mkdir命令的“权限被拒绝”。但如果我运行一次,然后等待几秒钟,然后再次运行,我不会得到这样的错误。 这里有什么问题?我想到三件事: Windows本身会延迟一些文件操作以保留元数据。例如,如果重命名一个文件并

通常在Windows7控制台中,如果我非常快地运行python程序两次,那么

if os.path.isdir(d):
    shutil.rmtree(d)
if not os.path.exists(d):
    os.mkdir(d)
其中
d
是包含许多文件的目录的名称,我得到
mkdir
命令的“权限被拒绝”。但如果我运行一次,然后等待几秒钟,然后再次运行,我不会得到这样的错误。
这里有什么问题?

我想到三件事:

  • Windows本身会延迟一些文件操作以保留元数据。例如,如果重命名一个文件并在其位置创建另一个文件,Windows会有一个时间窗口,在该时间窗口中,ACL之类的内容会传输到新文件。这是一个“特性”,即使在删除旧文件之前写入新文件的程序也能保留该元数据,以避免在中间失败的情况下丢失数据。
  • 恶意软件扫描器有时会挂接到文件系统操作中,并对文件执行扫描,搜索恶意软件(或者政府批评文本,如果你是偏执狂,甚至如果你不是偏执狂)。在扫描期间,对该文件的其他一些访问被阻止

  • 最后,我不确定如何实现
    shutil.rmtree()
    ,但在Windows下,一些树操作实际上不是由操作系统内核实现的,而是由shell(即资源管理器)实现的,它们可以异步执行,这将解释一个短时间窗口,在该窗口中,即使呼叫已经返回,路径仍然被阻塞


  • 我相信,例如Subversion,或者更确切地说,ApachePortable运行时遇到了同样的问题,并通过延迟重试解决了这个问题。此解决方案不会赢得选美比赛,但似乎可以胜任(tm)。

    毫无疑问,使用延迟然后重试是唯一的解决方案。谢谢,这是更简单的解决办法。删除前只需“os.rename”文件夹。重命名是即时的。绝对不是(2),因为这种行为是完全可复制的。对我来说(3)听起来是最合理的解释。异步文件操作使我重新考虑使用shutil。@user443854-另一种可能的解释在Eryk Sun的回答中的讨论部分中提到:。基本上,在Windows下,“删除”会将文件标记为删除,但不会取消链接,直到最后一个文件句柄关闭。仅供参考此处的一些相关讨论线程: