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

发布于 2021-01-29 17:13:12

在Windows 7控制台中,如果我非常快地两次运行python程序,这通常会

if os.path.isdir(d):
    shutil.rmtree(d)
if not os.path.exists(d):
    os.mkdir(d)

其中d包含许多文件的目录的名称在哪里,我得到该mkdir命令的“权限被拒绝”
。但是,如果我运行一次,然后等待几秒钟,然后再次运行,则不会出现此类错误。这里有什么问题?

关注者
0
被浏览
45
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我想到了三件事:

    1. Windows本身会延迟某些文件操作以保留元数据。例如,如果您重命名文件并在其位置创建另一个文件,则Windows会在一个时间窗口中将诸如ACL之类的内容传输到新文件中。这是一个“功能”,即使在删除旧文件之前写入新文件的程序中也保留了此元数据,以便在中间出现故障时不会丢失数据。

    2. 恶意软件扫描程序有时会涉入文件系统操作并执行文件扫描,以搜索恶意软件(或政府批判性文本,如果您偏执狂,甚至可能不是偏执狂)。在该扫描过程中,对文件的某些其他访问被阻止。

    3. 最后,我不确定如何shutil.rmtree()实现,但是在Windows下,某些树操作实际上不是由OS内核而是由外壳程序(即Explorer)实现的,并且它们可以异步执行,这将解释一个很短的时间窗口即使调用已经返回,路径仍然被阻塞。

    我认为,例如Subversion或Apache Portable
    Runtime偶然发现了同一问题,并通过延迟重试来解决该问题。这种解决方案没有赢得选美比赛,但似乎可以胜任工作。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看