1.情景展示

在实际开发过程当中,对于文件目录或者文件进行操作,是不可避免的,可能会遇到两个问题:

问题1:如何通过java删除多个下级空目录?

问题2:如何通过java删除多个上级空目录?

2.具体分析

在开始之前,我们需要了解java删除目录所需达成的条件。

举个栗子:

我们想要通过java删除文件目录:3,如何操作?

java 向上、向下递归删除多级空目录(实用)_JAVAUTILS

测试一:直接删除目录3;

java 向上、向下递归删除多级空目录(实用)_删除目录_02

通过上图代码运行结果,可以发现:

当目录3下有子目录的时候,在java当中,是无法直接删除目录3的;

测试二:直接删除目录4;

java 向上、向下递归删除多级空目录(实用)_删除目录_03

通过上图代码运行结果,可以发现:

当目录4下有子文件时,在java当中,是无法直接删除目录4的;

小结:

要想通过java删除一个目录,必须要确保它是一个空目录;

换句话说就是:要想删除本目录,必须先删除它下属的子文件以及子目录。

所以要想删除成功,需要用到java当中的递归。

3.删除多个下级空目录

这里只考虑目录下面有子空白目录的情形,不考虑目录下面还有子文件的情况。

在实际开发过程中,我也没有遇到过这种需求,网上也都是这样的案例。

java 向上、向下递归删除多级空目录(实用)_子目录_04

此时,目录2,3,4都是空目录,如何将其删除掉?

方式一:

/**
* 递归删除多级空子目录
* @explain
* @param file
*/
public static void removeChildrenEmptyDirectory(File file) {
File[] fileList = file.listFiles();
for (File f : fileList) {//遍历集合
if (f.isDirectory()) {//判断是目录
//递归调用,直到找到最下级目录才执行删除操作(从最下级开始往上级删除)
removeChildrenEmptyDirectory(f);
//删除本目录
System.out.println(f.delete());

}
}

}

测试:

public static void main(String[] args) {
String filepath = "D:\\workspace-eclipse2021\\TWRS2.1\\web\\uploadfile\\2";
File file = new File(filepath);
if (file.exists()) {//判断路径是否存在
removeChildrenEmptyDirectory(file);
// 删除本级目录
if (file.isDirectory()) {
file.delete();
}
}

}

测试结果: 

java 向上、向下递归删除多级空目录(实用)_JAVAUTILS_05

java 向上、向下递归删除多级空目录(实用)_删除目录_06

方式二:java8

重新创建多级目录

java 向上、向下递归删除多级空目录(实用)_JAVAUTILS_07

多个目录使用/分开

java 向上、向下递归删除多级空目录(实用)_子目录_08

public static boolean removeChildrenEmptyDirectory2(File file) {
// 子目录递归调用本方法
Arrays.asList(file.listFiles()).forEach(Test::removeChildrenEmptyDirectory2);
// 执行删除命令
return file.delete();
}

调用

String filepath = "D:\\workspace-eclipse2021\\TWRS2.1\\web\\uploadfile\\2";
File file = new File(filepath);
if (file.exists()) {//判断路径是否存在
removeChildrenEmptyDirectory2(file);
// 删除本级目录
file.delete();
}

执行效果与方式一一模一样,都会将目录2进行删除。

4.删除多个上级空目录

我在实际开发当中,用到的是这个,即:

文件既然支持用户上传,必然有支持删除的需求;

java 向上、向下递归删除多级空目录(实用)_子目录_09

当将上传的文件进行删除时,如果我们只删除对应的文件内容的话,会导致:生成的空目录文件越来多。

java 向上、向下递归删除多级空目录(实用)_删除目录_10

所以,我们需要在文件删除的时候,检测它的上级目录是否也是空的,如果是空的,就将其删掉。

代码实现

/**
* 递归删除父级空目录
* @explain
* @param parentPath
*/
public static void removeEmptyParentsDirectory(String parentPath) {
File parentFile = new File(parentPath);
// 父级目录里没有子文件
if (parentFile.listFiles().length < 1) {
// 删除本级目录
if (parentFile.delete()) {
// 并进一步获取上级目录
removeEmptyParentsDirectory(parentFile.getParent());
}
}

}

调用:

public static void main(String[] args) {
String filepath = "D:\\workspace-eclipse2021\\TWRS2.1\\web\\uploadfile\\1\\2\\3\\4\\5\\1650182300616.png";
File file = new File(filepath);
// 文件存在并且是文件
if (file.exists() && file.isFile()) {//判断路径是否存在
if (file.delete()) {// 删除硬盘文件
// 删除父级空目录
removeEmptyParentsDirectory(file.getParent());
}
}
}

测试1:

java 向上、向下递归删除多级空目录(实用)_JAVAUTILS_11

结果1:本文件及父级空目录全部删除

java 向上、向下递归删除多级空目录(实用)_java_12

 

测试2:

java 向上、向下递归删除多级空目录(实用)_子目录_13

结果2:文件被删除,且它的上级目录5也被删除,组父级目录4,由于它有子文件,所以得以保留。

java 向上、向下递归删除多级空目录(实用)_子目录_14

5.删除多级下级目录及文件

虽然上面有删除多个下级目录的方法,但是,也仅仅局限于下级目录是空白目录;

当我们想删除下级目录,而不管它还有没有下属的子目录或者子文件时,如何实现?

不管下级有目录还是文件,统统删除。

java 向上、向下递归删除多级空目录(实用)_删除目录_15

方式一:

/**
* 递归删除多级子目录及子文件
* @explain
* @param file
*/
public static void removeChildren(File file) {
File[] fileList = file.listFiles();
for (File f : fileList) {//遍历集合
if (f.isDirectory()) {//判断是目录
//递归调用,直到找到最下级目录才执行删除操作(从最下级开始往上级删除)
removeChildren(f);
}
// 删除子目录及子文件
f.delete();
}
}

调用

String filepath = "D:\\workspace-eclipse2021\\TWRS2.1\\web\\uploadfile\\2";
File file = new File(filepath);
removeChildren(file);

方式二:

/**
* 删除子目录及子文件
* @explain 递归删除
* @param file
* @return
*/
public static boolean removeChildren2(File file) {
Arrays.asList(file.listFiles()).forEach(f -> {
// 如果是子目录,递归调用本方法,直到下方没有目录为止
if (f.isDirectory()) {
removeChildren2(f);
}
// 当下方没有目录时,执行删除命令(子文件和子目录都会被删除)
f.delete();
});
return true;
}

调用

String filepath = "D:\\workspace-eclipse2021\\TWRS2.1\\web\\uploadfile\\2";
File file = new File(filepath);
removeChildren2(file);

测试结果 

java 向上、向下递归删除多级空目录(实用)_子目录_16

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

  • ​​个人主页​​
  • ​​springboot 文件上传示例(webuploader插件)​​

作者:​​Marydon​​