删除python上非空的目录

时间:2016-07-16 00:11:02

标签: python delete-file

所以,我需要清理一个非空的目录。 我创建了以下函数。出于测试原因,我尝试删除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上失败了。

2 个答案:

答案 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