Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果文件及其父目录为';你是空的。(爪哇)_Java_Java 7_Java Io - Fatal编程技术网

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));将等待目录不存在,然后继续递归遍历。