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

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

Created by Marydon on 2022-04-17 19:42

1.情景展示

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

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

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

2.具体分析

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

举个栗子:

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

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

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

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

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

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

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

小结:

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

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

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

3.删除多个下级空目录

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

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

此时,目录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();
}
}
}

测试结果: 

方式二:java8

重新创建多级目录

多个目录使用/分开

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.删除多个上级空目录

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

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

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

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

代码实现

/**
* 递归删除父级空目录
* @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:

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

 

测试2:

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

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

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

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

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

方式一:

/**
* 递归删除多级子目录及子文件
* @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);

测试结果 

写在最后

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

 相关推荐:

与君共勉:最实用的自律是攒钱,最养眼的自律是健身,最健康的自律是早睡,最改变气质的自律是看书,最好的自律是经济独立 。

您的一个点赞,一句留言,一次打赏,就是博主创作的动力源泉!

↓↓↓↓↓↓写的不错,对你有帮助?赏博主一口饭吧↓↓↓↓↓↓

posted @   Marydon  阅读(1640)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
sorry,本博客所有代码禁止复制,原创代码需扫码支付方可获取!
关闭

1、先加好友再付费,点我加好友;

2、代码不能满足你的需求?加好友付费定制你的专属代码!

3、付费标准及方式,点我查看详情。