删除目录,是不是在蟒蛇
空的,所以,我需要清理的目录不为空。 我已经创建了如下function.For测试的原因我想删除JDK安装删除目录,是不是在蟒蛇
def clean_dir(location):
fileList = os.listdir(location)
for fileName in fileList:
fullpath=os.path.join(location, fileName)
if os.path.isfile(fullpath):
os.chmod(fullpath, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
os.remove(location + "/" + fileName)
elif os.path.isdir(fullpath):
if len(os.listdir(fullpath)) > 0:
clean_dir(fullpath)
#os.rmdir(location + "/" + fileName)
shutil.rmtree(location + "/" + fileName)
return
我试图用rmtree和rmdir,但它失败。
我得到了使用rmtree的错误是:
OSError: Cannot call rmtree on a symbolic link
这是当我用命令rmdir我得到了错误:
OSError: [Errno 66] Directory not empty: '/tmp/jdk1.8.0_25/jre/lib/amd64/server'
代码正常的窗口。但由于某种原因,它在Linux上失败。
kronenpj感谢,认为他的想法。但是当你有一个符号链接的时候,它试图删除是一个正常的文件并且失败。我不得不添加一个新的elif并添加取消链接选项符号链接
def clean_dir(location):
fileList = os.listdir(location)
for fileName in fileList:
fullpath=os.path.join(location, fileName)
if os.path.isfile(fullpath):
os.chmod(fullpath, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
os.remove(os.path.join(location, fileName))
elif os.path.islink(fullpath):
os.unlink(fullpath)
elif os.path.isdir(fullpath):
if len(os.listdir(fullpath)) > 0:
clean_dir(fullpath)
#os.rmdir(location + "/" + fileName)
shutil.rmtree(os.path.join(location, fileName))
return
绝对正确,我不确定是否remove()会正确处理符号链接。 – kronenpj
您遇到的方式在Windows和Linux(UNIX真)处理的文件系统之间的区别之一。我相信,增加一个额外的情况下,以您的代码将至少帮助:
...
for fileName in fileList:
fullpath = os.path.join(location, fileName)
## |<-- Handle symlink -->|
if os.path.islink(fullpath) or os.path.isfile(fullpath):
os.chmod(fullpath, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
os.remove(os.path.join(location, fileName))
elif os.path.isdir(fullpath):
if len(os.listdir(fullpath)) > 0:
clean_dir(fullpath)
#os.rmdir(os.path.join(location, fileName))
shutil.rmtree(os.path.join(location, fileName))
...
这应该妥善处理好其中的条目是一个符号链接的情况下,将其取下就像一个文件。我不知道该chmod
是必要的 - 它可能工作在链接的目标,但它不应该伤害来处理它的方式与文件相同。
但是,我只是检查并且os.path.file
针对符号链接返回指向的“事物”的类型,因此需要额外的检查来区分链接本身和指向的事物。同样为了便于携带,而不是追加“/”,如上面新编辑的那样使用os.path.join
。
你在一个符号链接,而不是一个目录指向rmtree。 https://en.wikipedia.org/wiki/Symbolic_link – iScrE4m
如果它是一个符号链接,我想'os.unlink(...)'是你所需要的。 (为了澄清,这将只是删除符号链接。它不会删除任何符号链接指向的内容。) – smarx
IIRC,'os.unlink'应该删除的文件。 – kronenpj