4

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

它删除了文件,它的父目录,但是它的下一个父目录并没有被删除,因为它抛出了一个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());
}

如果有人能给出更好的解决方案,这个问题仍然有待批准。谢谢。

4

2 回答 2

6

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

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());
}
于 2012-11-26T19:49:19.907 回答
1

我建议你的问题在这里

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

您删除父文件夹,再次调用您的方法以尝试删除相同的文件夹......因为它不再存在,第二个调用只是失败并存在而不做任何事情。

我还会添加一个签入以查看目录是否为空,但你是对的,异常会捕获它,我只是认为这是一种不好的做法,并且你正在寻找的条件异常 - 恕我直言

于 2012-11-26T20:04:31.847 回答