所以,我需要清理一个非空的目录。 我创建了以下函数。出于测试原因,我尝试删除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:无法在符号链接上调用rmtree
这是我使用rmdir时遇到的错误:
OSError:[Errno 66]目录不为空: ' /tmp/jdk1.8.0_25/jre/lib/amd64/server'
代码在Windows上正常运行。但由于某种原因,它在Linux上失败了。
答案 0 :(得分:2)
您遇到了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
对象符号链接返回&#34;事物的类型&#34;这是指向的,因此需要额外的检查来区分链接本身和指向的东西。也可以移动,而不是附加&#34; /&#34;使用上面新编辑的os.path.join
。
答案 1 :(得分:1)
kronenpj谢谢,这就是主意。但是当你有一个符号链接时,它试图删除就像普通文件一样失败了。我不得不添加一个新的elif并添加符号链接的unlink选项
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