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

gio*_*ine 3 java java-io java-7

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

它删除文件及其父目录,但是,它的下一个父项在它抛出时不会被删除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());
}
Run Code Online (Sandbox Code Playgroud)

如果有人能提供更好的解决方案,那么这个问题仍然需要批准.谢谢.

Per*_*ion 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());
}
Run Code Online (Sandbox Code Playgroud)