在Python中运行shutil.rmtree(d)后,权限被拒绝执行os.mkdir(d)
在Windows 7控制台中,如果我非常快地两次运行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下,某些树操作实际上不是由OS内核而是由外壳程序(即Explorer)实现的,并且它们可以异步执行,这将解释一个很短的时间窗口即使调用已经返回,路径仍然被阻塞。
我认为,例如Subversion或Apache Portable
Runtime偶然发现了同一问题,并通过延迟重试来解决该问题。这种解决方案没有赢得选美比赛,但似乎可以胜任工作。 -