Java实现递归删除菜单和目录及目录下所有文件

 更新时间:2025年03月04日 10:19:56   作者:Javaの甘乃迪  
这篇文章主要为大家详细介绍了Java如何实现递归删除菜单和删除目录及目录下所有文件,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下

一、什么是递归

递归调用是一种特殊的嵌套调用,是某个函数调用自己或者是调用其他函数后再次调用自己的,只要函数之间互相调用能产生循环的则一定是递归调用,递归调用一种解决方案,一种是逻辑思想,将一个大工作分为逐渐减小的小工作,比如说一个和尚要搬50块石头,他想,只要先搬走49块,那剩下的一块就能搬完了,然后考虑那49块,只要先搬走48块,那剩下的一块就能搬完了,递归是一种思想,只不过在程序中,就是依靠函数嵌套这个特性来实现了。

递归调用就是在当前的函数中调用当前的函数并传给相应的参数,这是一个动作,这一动作是层层进行的,直到满足一般情况的的时候,才停止递归调用,开始从最后一个递归调用返回。

二、示例分析

案例1:递归删除菜单及其所有子菜单

菜单实体类

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
 
import java.io.Serializable;
import java.util.Date;
 
/**
 * 系统菜单
 */
@Data
@TableName(value = "menu")
public class Menu implements Serializable {
 
    private static final long serialVersionUID = 1L;
 
    /*** 菜单ID*/
    @TableId(type = IdType.INPUT)
    private Long menuId;
 
    /*** 父级菜单ID*/
    private Long upMenuId;
 
    /*** 菜单编码*/
    private String menuCode;
 
    /*** 菜单名称*/
    private String menuName;
 
    /*** 菜单级别(默认1级)*/
    private Integer menuLevel;
 
    /*** 菜单页面打开方式(1-本页面打开 2 新标签页打开 3-新窗口打开)*/
    private Integer pageOpenType;
 
    /*** 菜单类型(1-菜单 2-权限按钮)*/
    private Integer menuType;
 
    /*** 菜单图标*/
    private String menuIcon;
 
    /*** 菜单URL*/
    private String menuUrl;
 
    /*** 菜单序号*/
    private Integer menuOrder;
 
    /*** 菜单描述*/
    private String menuDesc;
 
    /*** 数据状态(0-删除 1-正常) */
    private Integer dataFlag;
 
    /*** 是否禁用(0-否 1-是)*/
    private Integer isDisable;
 
    /*** 创建人ID*/
    private Long createId;
 
    /*** 创建时间*/
    private Date createTime;
 
}

实现代码

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.test.java.domain.entity.Menu;
import com.test.java.mapper.MenuMapper;
import com.test.java.service.MenuService;
import org.springframework.util.CollectionUtils;
 
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
 
public class MenuServiceImpl implements MenuService {
 
    @Resource
    private MenuMapper menuMapper;
 
    @Override
    public Integer deleteMenuById(Long menuId) {
        // 校验当前要删除的菜单是否存在
        Menu menu = menuMapper.selectById(menuId);
        if (null == menu) {
            throw new RuntimeException("菜单已删除");
        }
 
        // 创建list集合,用于封装所有要删除的菜单ID
        List<Long> menuIdList = new ArrayList<>();
        // 向menuIdList集合设置删除菜单id(根据id删除菜单)
        this.queryMenuChildById(menuId, menuIdList);
        // 把当前菜单id封装到idList里面
        menuIdList.add(menuId);
 
        // 批量删除当前菜单 及其所有子菜单
        return menuMapper.deleteBatchIds(menuIdList);
    }
 
 
    // 根据当前菜单id,查询其所有子菜单id,再封装到idList集合
    private void queryMenuChildById(Long menuId, List<Long> idList) {
        // 查询菜单里面子菜单id
        QueryWrapper<Menu> wrapper = new QueryWrapper<>();
        wrapper.eq("up_menu_id", menuId);
        List<Menu> childMenuList = menuMapper.selectList(wrapper);
        if (!CollectionUtils.isEmpty(childMenuList)) {
            // 把childMenuList里面菜单id值获取出来,封装idList里面,做递归查询
            childMenuList.forEach(item -> {
                //封装idList里面
                idList.add(item.getMenuId());
                //递归查询
                this.queryMenuChildById(item.getMenuId(), idList);
            });
        }
    }
 
}

案例2:递归删除目录及其目录中所有文件

实现代码

import lombok.extern.slf4j.Slf4j;
 
import java.io.File;
 
/**
 * 文件相关工具类
 */
@Slf4j
public class FileUtils {
 
    /**
     * 删除文件或文件夹
     *
     * @param path 文件路径
     * @return 返回true(删除成功), 返回false(删除失败)
     */
    public static boolean deleteFileOrDirectory(String path) {
        File file = new File(path);
        // 判断文件是否存在
        if (file.exists()) {
            // 判断是否为文件
            if (file.isFile()) {
                // 删除文件
                return deleteFile(path);
            } else {
                // 删除文件夹
                return deleteDirectory(path);
            }
        } else {
            return false;
        }
    }
 
    /**
     * 删除文件
     *
     * @param path 文件路径
     * @return 返回true(删除成功), 返回false(删除失败)
     */
    public static boolean deleteFile(String path) {
 
        boolean result = false;
 
        File file = new File(path);
        if (file.isFile() && file.exists()) {
            result = file.delete();
            log.info("删除文件成功:{}", path);
            return result;
        } else {
            log.info("删除文件失败:{}", path);
            return result;
        }
    }
 
    /**
     * 删除文件夹(先删文件再删目录)
     *
     * @param path 文件夹路径
     * @return 返回true(删除成功), 返回false(删除失败/文件夹不存在)
     */
    public static boolean deleteDirectory(String path) {
        if (!path.endsWith(File.separator)) {
            // 补齐文件分隔符
            path = path + File.separator;
        }
        File directoryFile = new File(path);
        // 文件不存在、不是一个目录就打印退出返回false
        if (!directoryFile.exists() || !directoryFile.isDirectory()) {
            log.info("文件夹不存在,{}", path);
            return false;
        }
 
        boolean flag = true;
        // 获取所有的子文件及子文件夹
        File[] files = directoryFile.listFiles();
        if (files != null) {
            // 循环删除
            for (File file : files) {
                // 删除子文件
                if (file.isFile()) {
                    flag = deleteFile(file.getAbsolutePath());
                    if (!flag) {
                        break;
                    }
                } else {// 删除子文件夹
                    flag = deleteDirectory(file.getAbsolutePath());
                    if (!flag) {
                        break;
                    }
                }
            }
        }
        if (!flag) {
            log.info("删除文件夹失败");
            return false;
        }
        // 最后删除当前文件夹
        if (directoryFile.delete()) {
            log.info("删除文件夹成功,{}", path);
            return true;
        } else {
            log.info("删除文件夹失败,{}", path);
            return false;
        }
    }
 
}

到此这篇关于Java实现递归删除菜单和目录及目录下所有文件的文章就介绍到这了,更多相关Java递归删除文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一问详解SpringBoot配置文件优先级

    一问详解SpringBoot配置文件优先级

    在SpringBoot项目当中,我们要想配置一个属性,可以通过这三种方式当中的任意一种来配置都可以,那么优先级怎么算,本文主要介绍了一问详解SpringBoot配置文件优先级,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 一篇文章详解Java异常处理

    一篇文章详解Java异常处理

    异常处理是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件),这篇文章主要给大家介绍了关于Java异常处理的相关资料,需要的朋友可以参考下
    2023-12-12
  • Spring Cloud应用实现配置自动刷新过程详解

    Spring Cloud应用实现配置自动刷新过程详解

    这篇文章主要介绍了Spring Cloud应用实现配置自动刷新过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • SpringBoot2 整合MinIO中间件实现文件便捷管理功能

    SpringBoot2 整合MinIO中间件实现文件便捷管理功能

    这篇文章主要介绍了SpringBoot2 整合MinIO中间件,实现文件便捷管理,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 简单谈谈ThreadPoolExecutor线程池之submit方法

    简单谈谈ThreadPoolExecutor线程池之submit方法

    下面小编就为大家带来一篇简单谈谈ThreadPoolExecutor线程池之submit方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Spring注解与P/C命名空间超详细解析

    Spring注解与P/C命名空间超详细解析

    Spring注解方式减少了配置文件内容,更加便于管理,并且使用注解可以大大提高了开发效率!注解本身是没有功能的,和xml一样,注解和xml都是一种元数据,元数据即解释数据的数据,也就是所谓的配置
    2022-11-11
  • SpringBoot中的@Conditional 注解的使用

    SpringBoot中的@Conditional 注解的使用

    @Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件的才给容器注册Bean,本文主要介绍了SpringBoot中的@Conditional 注解的使用
    2024-01-01
  • 一文教会你用mybatis查询数据库数据

    一文教会你用mybatis查询数据库数据

    MyBatis本身是一个数据库连接框架,可以认为是JDBC的升级版,下面这篇文章主要给大家介绍了关于mybatis查询数据库数据的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 简介Java的Spring框架的体系结构以及安装配置

    简介Java的Spring框架的体系结构以及安装配置

    这篇文章主要介绍了Java的Spring框架的体系结构以及安装配置,Spring框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • Spring Boot CLI安装教程

    Spring Boot CLI安装教程

    Spring Boot是一个命令行工具,用于使用Spring进行快速原型搭建。本文重点给大家介绍Spring Boot CLI安装教程,感兴趣的朋友参考下吧
    2017-08-08

最新评论