我正在尝试一个简单的方法,如果文件是空的,直到它到达基目录,就删除文件的上层目录,但是我无法使它工作。
它删除文件及其父目录,但是,它的下一个父项不会被删除,因为它会抛出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());
}
如果有人能提供更好的解决方案,那么这个问题仍有待批准。 感谢。
答案 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