首页 > 解决方案 > 使用 shutil.rmtree 删除后立即使用 os.makedirs 创建目录时出错

问题描述

当尝试在删除后立即创建一个新的(深层)目录(在本地 ssd 上)时,Python 3.6 会PermissionError在该os.makedirs(dirName)行中报告 a。解决此问题的唯一方法是sleep在删除目录后等待 1 秒钟,然后就没有错误了。我是否以错误的方式使用 API,这是 Python 问题还是可能是什么?

例子:

dirName = "a/b/c"

if os.path.isdir(dirName):
        shutil.rmtree(dirName)
        #time.sleep(1)

os.makedirs(dirName)

错误:

  File "C:\Program Files\Python37\lib\os.py", line 221, in makedirs
    mkdir(name, mode)
PermissionError: [WinError 5] Access is denied: '...'

  File "C:\Program Files\Python37\lib\os.py", line 221, in makedirs
    mkdir(name, mode)
PermissionError: [WinError 5] Access is denied: '...'

标签: pythonfile-access

解决方案


您的代码看起来不错,但是,您收到此错误可能有几个原因:

  1. 在网络驱动器上,文件操作必须通过网络同步,不幸的是,这有时可能会导致此类问题。轻微的延迟(和/或其他重试机制)是一种令人讨厌的变通方法,在这种情况下可能会解决问题。

  2. 如果目录正在使用中,则在相应的应用程序释放资源之前不能删除它。如果您在编辑器中打开了该目录中的任何文件,则该目录可以被使用。即使您关闭了文件,某些应用程序也会锁定目录(因此您应该关闭应用程序以释放目录)。另请注意,某些后台任务(例如,Tortoise SVN、备份实用程序或病毒扫描程序)可能会暂时锁定目录。

    请注意,此行为可能在 Windows 和 Linux 之间有所不同。在 Linux 中,如果一个文件还在使用中被删除,低级文件句柄将一直有效,直到被相应的应用程序释放,但文件本身会被重命名为一些临时唯一的长文件名,所以你不会有这个问题。Windows 似乎以不同的方式处理它。


推荐阅读