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

测试结果 

写在最后

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

 相关推荐:

posted @ 2022-04-17 19:42  Marydon  阅读(1630)  评论(0编辑  收藏  举报