Java 如果文件及其父目录为';你是空的。(爪哇)
我正在尝试一个简单的方法,删除一个文件,如果上面的目录是空的,直到它到达一个基本目录,但是我不能让它工作 它删除文件及其父目录,但不会删除其下一个父目录,因为它会抛出一个Java 如果文件及其父目录为';你是空的。(爪哇),java,java-7,java-io,Java,Java 7,Java Io,我正在尝试一个简单的方法,删除一个文件,如果上面的目录是空的,直到它到达一个基本目录,但是我不能让它工作 它删除文件及其父目录,但不会删除其下一个父目录,因为它会抛出一个目录notemptyexception。它实际上是空的,因为只有一个子目录,并且在上一次迭代中被删除 因此,文件被删除,其父目录被删除,并停止在那里,不再删除更高的目录 编辑:(修改代码) 似乎删除目录有延迟,因此在下一次检查目录的空状态时,上一个目录尚未删除。所以我添加了一个while循环来检查目录是否存在。我不知道这是不是一
目录notemptyexception
。它实际上是空的,因为只有一个子目录,并且在上一次迭代中被删除
因此,文件被删除,其父目录被删除,并停止在那里,不再删除更高的目录
编辑:(修改代码)
似乎删除目录有延迟,因此在下一次检查目录的空状态时,上一个目录尚未删除。所以我添加了一个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());
}
如果有人能给出更好的解决方案,这个问题仍有待批准。
谢谢。您没有空目录的基本条件,因此在第二次执行递归函数时,它会在目录本身之前尝试删除空目录父目录。一个简单的代码更改就足以解决此问题:
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());
}
我建议你的问题就在这里
Files.delete(path.getParent());
removeFileAndParentsIfEmpty(path.getParent());
您删除了父文件夹,再次调用您的方法尝试删除同一个文件夹…因为它不再存在,第二次调用只是失败了,并且没有做任何操作就存在了
我还想添加一个签入以查看目录是否为空,但您是对的,异常将捕获它,我只是认为对于您要查找的条件使用它和异常是一种不好的做法-IMHO当抛出异常时,该方法不会停止,我的意思是,如果Files.delete()抛出DirectoryNotEmptyException,它被捕获,并且方法结束时没有执行另一个递归调用,或者我错了?哦,对不起,错过了重新调用,我的错:PI将对此进行调查。如果你说这不是一个好的做法,我相信你,谢谢你的建议。我只是想保存代码。如果异常是“意外”情况,那么您是在预料这种情况,因此它不是“意外”。Java有时可能会抛出很多异常,但在过去几年中,我一直在使用基于C的系统,我更喜欢异常而不是错误级别和错误查找:你能检查我对代码所做的修改并告诉我是否可以吗?谢谢!我不确定while循环的作用是什么,但是它看起来可以。while循环要等到目录被删除,因为在下一个递归调用中,上一个目录还没有被删除。它应该是这样工作的,但它没有。似乎Files.delete()不会立即删除该目录,并且在下一次递归调用中再次调用该目录时,上一个目录仍然不会被删除,这是可能的吗?我必须做一些小技巧才能奏效,但我认为这没有什么用处。删除目录后,只需调用:''while(Files.exists(path));将等待目录不存在,然后继续递归遍历。