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


    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);

    测试结果 

    写在最后

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

     相关推荐:

  • 相关阅读:
    DIV+CSS一种简单的左边图片右边多行文字的布局
    超级精简的鼠标触发式下拉菜单
    JQuery全选反选 随其他checkbox自动勾选全选反选
    asp.net后台注册JavaScript
    IE浏览器中iframe背景BODY透明
    iframe自适应高度的超精简方法 IE6/7/8/9 &amp; FF经测试完全通过
    Button1.Attributes.Add() 方法小结
    在美女秘书的身体上寻找股市的趋势!很准的!
    无意中发现google Reader中的内容居然不与RSS源同步!
    参加阿里软件“旺斯卡”,居然给我寄来了1件T恤和1个4GB优盘
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/16156995.html
Copyright © 2020-2023  润新知