Cub*_*i73 5 windows rmdir python-3.x
假设以下目录结构:
A
+-- B
| +-- C
| | +-- D
| | | +-- E
Run Code Online (Sandbox Code Playgroud)
其中没有目录包含任何文件(甚至不可见的文件)。跑步
os.rmdir("A/B/C/D/E"); os.rmdir("A/B/C/D"); os.rmdir("A/B/C"); os.rmdir("A/B"); os.rmdir("A")
Run Code Online (Sandbox Code Playgroud)
在 Python (3.5) 中产生
OSError: [WinError 145] The directory is not empty: '##'
Run Code Online (Sandbox Code Playgroud)
其中##
或者是A
,B
,C
或D
,但在执行各功能手动不产生此异常。我知道有shutil.rmtree
,但文件os.rmdir
明确指出
移除(删除)目录路径。仅在目录为空时有效,否则
OSError
会引发。为了删除整个目录树,shutil.rmtree()
可以使用。
至少在 Windows 系统上,情况似乎并非如此。到目前为止我发现的唯一解决方法(不包括shutil.rmtree
)是
def rm (dir_path):
while len(os.listdir(dir_path)) > 0:
pass # Maybe include timeout here to not lock the program
os.rmdir(dir_path)
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是os.rmdir
应该在删除目录之前不会阻止?
编辑:查看(对于 Windows 上的 CPython 3.5)的源代码,os.rmdir
我们可以看到它RemoveDirectoryW
用于删除。该言论一节的文档的RemoveDirectoryW
状态
RemoveDirectory 函数标记一个目录以在关闭时删除。因此,在关闭目录的最后一个句柄之前,不会删除该目录。
尽管我试图确保目录没有句柄,但我认为这实际上可能是问题所在(感谢@armatita 的提示)。