我尝试使用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的行为的任何想法?我该如何解决这个问题?
答案 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());
}