删除文件及其父目录(如果它们为空)。 (Java)

时间:2012-11-26 19:44:07

标签: java java-7 java-io

我正在尝试一个简单的方法,如果文件是空的,直到它到达基目录,就删除文件的上层目录,但是我无法使它工作。

它删除文件及其父目录,但是,它的下一个父项不会被删除,因为它会抛出DirectoryNotEmptyException。它确实是空的,因为只有一个子目录,它在上一次迭代中被删除了。

因此,文件被删除,其父文件被删除,并在那里停止,不再删除上层目录。

已编辑:(修改后的代码)

似乎延迟删除目录,因此在下一次检查目录的空白状态时,前一个目录尚未删除。所以我添加了一个while循环来检查,直到该目录不存在。我不知道这是不是一个坏技术,但它适合我的需要。

public static void removeFileAndParentsIfEmpty(Path path) throws IOException {
    if(path == null || path.endsWith(FilesPath.BILLS_DIRECTORY)) {
        return;
    }
    if (Files.isRegularFile(path)){
        Files.deleteIfExists(path);
    } else if (Files.isDirectory(path)){
        if(path.toFile().list().length == 0){
            Files.delete(path);
            while(Files.exists(path));
        }else{
            return;
        }
    } else {
        return;
    }
    removeFileAndParentsIfEmpty(path.getParent());
}

如果有人能提供更好的解决方案,那么这个问题仍有待批准。 感谢。

2 个答案:

答案 0 :(得分:5)

您没有空目录的基本条件,因此在第二个遍历您的递归函数时,它会尝试在目录本身之前删除空目录parent。一个简单的代码更改应该足以解决这个问题:

public static void removeFileAndParentsIfEmpty(Path path)
        throws IOException {
    if(path == null || path.endsWith(BASEPATH)) return;

    if (Files.isRegularFile(path)) {
        Files.deleteIfExists(path);
    } else if(Files.isDirectory(path)) {
        try {
            Files.delete(path);
        } catch(DirectoryNotEmptyException e) {
            return;
        }
    }

    removeFileAndParentsIfEmpty(path.getParent());
}

答案 1 :(得分:1)

我建议你的问题在这里

Files.delete(path.getParent());
removeFileAndParentsIfEmpty(path.getParent());

您删除了父文件夹,再次调用您的方法尝试删除相同的文件夹...因为它不再存在,第二次调用只是通过并且没有做任何事情而存在。

我还要添加一个检查以查看该目录是否为空,但是你是对的,异常将捕获它,我只是将它看作是一个不好的做法,使用和异常条件你正在寻找 - IMHO