在java中清除没有排除文件的目录

时间:2017-05-17 23:03:31

标签: java

我尝试删除目录中的文件而没有文件路径在我的数组中

    public static boolean deleteDir(File dir, List<String> exclusionList) throws IOException {
    if (exclusionList != null && exclusionList.contains(dir.getCanonicalPath())) { // skip file

        System.out.println("Skipped: " + dir.getCanonicalPath());
        return true;
    }

    System.out.println("Deleting: " + dir.getCanonicalPath());
    if (dir.isDirectory()) {
        File[] children = dir.listFiles();
        boolean success = true;
        for (File element : children) {
            if (!deleteDir(element, exclusionList)) {
                success = false;
            }
        }
        return success;
    }

    return dir.delete();
}

这是我删除的功能,并且可以正常删除.txt .yml等文件,但是当它必须删除文件夹(文件夹内容删除perflecty)但文件夹存在时,我有很多空文件夹; / < / p>

2 个答案:

答案 0 :(得分:1)

问题是由目录的处理方式引起的:

System.out.println("Deleting: " + dir.getCanonicalPath());
if (dir.isDirectory()) {
    File[] children = dir.listFiles();
    boolean success = true;
    for (File element : children) {
        if (!deleteDir(element, exclusionList)) {
            success = false;
        }
    }
    return success;   // <= for directories the method returns here
}

return dir.delete();

在目录中,该方法将以递归方式为所有子元素调用deleteDir,并检查是否所有子元素都已成功删除。之后,该方法只返回,而不删除目录本身。一个简单的解决方法是仅在某个子元素的删除失败时终止:

System.out.println("Deleting: " + dir.getCanonicalPath());
if (dir.isDirectory()) {
    File[] children = dir.listFiles();
    boolean success = true;
    for (File element : children) {
        if (!deleteDir(element, exclusionList)) {
            success = false;
        }
    }

    // return only if some child couldn't be deleted.
    if(!success)
        return false;
}

// delete the directory itself (or the file, if a file is passed as parameter)
return dir.delete();

答案 1 :(得分:0)

如果我正确理解了您的问题,那么删除文件后会有许多空文件夹,例如.txt,您希望它们消失了吗?

这是一个想法:

从删除子项(element)返回后,检查该目录中的目录和文件数是否为零,然后应用:

FileUtils.deleteDirectory(directory)

if (element is a directory and is empty) {
    FileUtils.deleteDirectory(element);
}

这应该是你想要的。继续编写if语句中的逻辑,它应该删除for循环中的每个空目录。

注意FileUtilshttp://commons.apache.org/proper/commons-io/

的一部分