java中的java删除目录

时间:2015-10-08 08:04:34

标签: java windows

我尝试使用java删除目录,这是我的代码

 public static void delDirectory(String path) throws IOException {
    Path p = Paths.get(path);
    delHelp(p);
}

private static void delHelp(Path p) throws IOException {
    if (!p.toFile().exists()) {
        return;
    } else if(p.toFile().isFile()){
        log.debug("delete file:" + p.toAbsolutePath().toString());
        Files.delete(p);
    }else if(p.toFile().isDirectory()){
        for(Path subPath:Files.newDirectoryStream(p)){
            delHelp(subPath);
        }
        log.debug("delete directory:"+p.toAbsolutePath().toString());
        Files.delete(p);
    }
}

在类似unix的系统上,它可以运行。在Windows上,代码Files.delete(p)实际上将目录移动到垃圾桶,因此在删除父目录时,代码将抛出异常:Exception in thread "main" java.nio.file.DirectoryNotEmptyException

关于这种依赖于os的行为的任何想法?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

实际问题是您没有关闭DirectoryStream,这会在您尝试删除目录时导致DirectoryNotEmptyException

来自Javadoc

  

当不使用try-with-resources构造时,应在迭代完成后调用目录流的close方法,以释放为打开目录保留的任何资源。

所以你可以在完成后调用close(),或者在try-with-resources中使用它:

private static void delHelp(Path p) throws IOException {
    if (!p.toFile().exists()) {
        return;
    } else if(p.toFile().isFile()){
        Files.delete(p);
    } else if(p.toFile().isDirectory()){

        try (DirectoryStream<Path> ds = Files.newDirectoryStream(p)) {
            for (Path subPath : ds){
                delHelp(subPath);
            }
        }

        Files.delete(p);
    }
}

答案 1 :(得分:0)

首先请先将Jar添加到您的项目中。

根据您的要求查找以下代码。

即。在窗口机上工作,不应该去垃圾桶/回收站

   public static void main(String[] args) {
            try {
                delDirectory("E:\\RecursiveDataContainDirectoryName");
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

        public static void delDirectory(String path) throws IOException {
                Path p = Paths.get(path);
                FileDeleteStrategy.FORCE.delete(p.toFile());
        }