如果我非常快速地两次运行 python 程序,那么经常在 Windows 7 控制台中
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 内核实现,而是由 shell(即资源管理器)实现,它们可以异步执行,这可以解释一个短时间窗口,其中即使调用已经返回,路径仍然被阻塞。
我相信例如 Subversion 或更确切地说是 Apache Portable Runtime 偶然发现了同样的问题,并通过简单地延迟重试来解决它。这个解决方案没有赢得选美比赛,但它似乎做的工作(tm)。