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);
测试结果
与君共勉:最实用的自律是攒钱,最养眼的自律是健身,最健康的自律是早睡,最改变气质的自律是看书,最好的自律是经济独立 。
您的一个点赞,一句留言,一次打赏,就是博主创作的动力源泉!
↓↓↓↓↓↓写的不错,对你有帮助?赏博主一口饭吧↓↓↓↓↓↓
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/16156995.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现