Java nio - 无法删除已清空的目录

时间:2013-01-10 19:12:21

标签: java io nio

我正在尝试遍历文件树并删除所有文件/目录。代码如下:

        Files.walkFileTree(metricPath, new SimpleFileVisitor<Path>() {

            @Override
            public FileVisitResult visitFile(Path file,
                                             BasicFileAttributes attrs) throws IOException {
                Files.delete(file);
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir,
                                                      IOException exc) throws IOException {
                if (exc == null) {
                    Files.delete(dir);
                    return FileVisitResult.CONTINUE;
                } else {
                    throw exc;
                }
            }
        });
    }

此代码在单元测试之间运行,每个单元测试都以folder1/folder2/file的形式生成单独的文件。当我尝试走这棵树时,当文件夹1尝试删除时会抛出DirectoryNotEmptyException,尽管它显然是空的......

4 个答案:

答案 0 :(得分:0)

你有没有检查隐藏文件的目录?在Windows上,可能是某个进程已打开此目录,打开的文件HANDLE仍存在于系统HANDLE表中。在那种情况下,目录被锁定,java可能会抛出该异常。

答案 1 :(得分:0)

正如我在代码中看到的那样,除非一个文件/文件夹处于只读模式,否则应该没有问题。您可能希望在删除之前先探索更改文件权限。

你还可以尝试将Files.delete()方法放在以下覆盖

public FileVisitResult visitFileFailed(Path file, IOException exc)

参考: JAVA NIO Directory Delete

答案 2 :(得分:0)

使用Apache Commons FileUtils.deleteDirectory()或FileUtils.deleteQuietly()

答案 3 :(得分:-1)

或者,您可以导入Apache Commons IO并使用其FileUtils.deleteDirectory(File directory)方法。只需一行即可,因为它会递归删除所有文件和子目录:

FileUtils.deleteDirectory(dirToBeDeleted);