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 {@Resourceprivate MenuMapper menuMapper;@Overridepublic Integer deleteMenuById(Long menuId) {// 校验当前要删除的菜单是否存在Menu menu = menuMapper.selectById(menuId);if (null == menu) {throw new RuntimeException("菜单已删除");}// 创建list集合,用于封装所有要删除的菜单IDList<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) {// 查询菜单里面子菜单idQueryWrapper<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);// 文件不存在、不是一个目录就打印退出返回falseif (!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;}}}

以上代码直接粘贴复制即可直接使用。

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/738248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝牙通讯——连接你我的无线魔法

引言&#xff1a; 在当今科技高速发展的时代&#xff0c;无线通讯技术已成为我们生活中不可或缺的一部分。其中&#xff0c;蓝牙通讯作为一种广泛应用的无线通讯技术&#xff0c;以其便捷、高效的特点&#xff0c;深入到了我们的日常生活与工作之中。那么&#xff0c;蓝牙通讯究…

Spring Data访问Elasticsearch(一)----Elasticsearch客户端

Spring Data访问Elasticsearch&#xff08;一&#xff09;----Elasticsearch客户端 一、命令式Rest客户端二、反应式&#xff08;Reactive&#xff09;Rest客户端三、客户端配置3.1 客户端配置回调3.1.1 底层Elasticsearch RestClient的配置:3.1.2 底层Elasticsearch RestClien…

掌握Go语言:精通Go语言运算符,解锁编程新境界(11)

算术运算符用于执行基本的数学运算&#xff0c;如加法、减法、乘法和除法等。在Go语言中&#xff0c;我们可以轻松使用这些运算符来进行数值计算&#xff0c;从而实现各种复杂的逻辑操作。让我们一起来深入了解各种算术运算符的使用方法及其在实际开发中的应用。 算术运算符 …

FFmpeg将视频包AVPacket通过视频流方式写入本地文件

1.写视频头 void writeVideoHeader(const char* videoFileName){int r avformat_alloc_output_context2(&pFormatCtx, nullptr, nullptr,videoFileName);if(r < 0){qDebug()<<"Error: avformat_alloc_output_context2: "<<av_err2str(r);return;…

Python 字符串引号 题解

Python 字符串引号 题解 预备知识 在 Python 中&#xff0c;可以使用引号 &#xff0c;" &#xff0c; 和 """来创建字符串。以下都是合法的字符串&#xff1a; aa aa bb "bb" cc cc dd """dd"""配对的引号不…

CloudSecOps实践之路:云安全运营全面解析

云计算已经获得了大量企业用户的青睐&#xff0c;并成为其数字化转型发展的基础&#xff0c;但是也面临着各种各样的风险&#xff0c;从勒索软件到供应链攻击&#xff0c;再到云内部威胁和配置错误&#xff0c;各种云安全事件层出不穷。随着更多的企业将其业务应用迁移至云端&a…

02_electron快速建立项目

一、安装 yarn 在此之前可以先安装 git&#xff1a;Git - Downloads (git-scm.com) 下面就是 yarn 安装的代码&#xff0c;在终端输入即可。 npm install --global yarn 检查是否安装成功&#xff1a; yarn --version 二、快速建立一个electron项目 其实在Getting Started - …

MYSQL Unknown column ‘appreciation.latitude‘ in ‘where clause‘

问题 笔者编写mysql语句&#xff0c;执行报错 详细问题 笔者sql代码 SELECT ap.*, su.username, wh.wheat_name FROM appreciation ap LEFT JOIN sys_user su ON su.id ap.user_id LEFT JOIN wheat wh ON wh.id ap.crop_id WHERE appreciation.latitude 1报错信息 >…

LeetCode707:设计链表

题目描述 实现 MyLinkedList 类&#xff1a; MyLinkedList() 初始化 MyLinkedList 对象。 int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效&#xff0c;则返回 -1 。 void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完…

GO语言-切片底层探索(下)

目录 切片的底层数据结构 扩容机制 总结&#xff1a; 练习验证代码 这是切片的底层探索下篇&#xff0c;上篇地址请见&#xff1a;GO语言-切片底层探索&#xff08;上&#xff09; 在上篇我们讲解了切片的两个重要实现或者说是两个特征 切片是引用类型&#xff0c;会进行…

java关键字是什么?关键字有哪些?什么是常量?

1、关键字 &#xff08;1&#xff09;关键字概述&#xff1a;被java语言赋予了特定含义的单词。 &#xff08;2&#xff09;关键字特点&#xff1a; 关键字的字母全部小写&#xff1b;常用的代码编辑器&#xff0c;针对关键字有特殊的颜色标记&#xff0c;非常直观。 以IDE…

【QT+QGIS跨平台编译】之七十一:【QGIS_Analysis跨平台编译】—【qgsrastercalclexer.cpp生成】

文章目录 一、Flex二、生成来源三、构建过程一、Flex Flex (fast lexical analyser generator) 是 Lex 的另一个替代品。它经常和自由软件 Bison 语法分析器生成器 一起使用。Flex 最初由 Vern Paxson 于 1987 年用 C 语言写成。 “flex 是一个生成扫描器的工具,能够识别文本中…

机器学习之分类回归模型(决策数、随机森林)

回归分析 回归分析属于监督学习方法的一种&#xff0c;主要用于预测连续型目标变量&#xff0c;可以预测、计算趋势以及确定变量之间的关系等。 Regession Evaluation Metrics 以下是一些最流行的回归评估指标: 平均绝对误差(MAE):目标变量的预测值与实际值之间的平均绝对差…

在 windows 下安装并调试 CMake

一、前言 CMake是一个跨平台的开源工具&#xff0c;用于管理软件项目的构建过程。它不直接构建软件&#xff0c;而是生成用于特定平台或编译器的构建文件&#xff08;如Makefile或Visual Studio项目文件&#xff09;&#xff0c;然后利用这些文件来实际构建软件。 二、初次尝…

微服务架构 | 架构演进

INDEX 1 架构演进 1 架构演进 standalone 就部署一份 可用性问题&#xff1a;只有一个点&#xff0c;单点故障 全挂流量瓶颈&#xff1a; 只有一个点&#xff0c;可以支持的流量有限性能越高的服务器价格会非线性增加 功能耦合&#xff1a;协同开发困难&#xff0c;各自改一…

大数据开发-Hive介绍以及安装配置

文章目录 数据库和数据仓库的区别Hive安装配置Hive使用方式Hive日志配置 数据库和数据仓库的区别 数据库&#xff1a;传统的关系型数据库主要应用在基本的事务处理&#xff0c;比如交易&#xff0c;支持增删改查数据仓库&#xff1a;主要做一些复杂的分析操作&#xff0c;侧重…

Day34:安全开发-JavaEE应用反射机制攻击链类对象成员变量方法构造方法

目录 Java-反射-Class对象类获取 Java-反射-Field成员变量类获取 Java-反射-Method成员方法类获取 Java-反射-Constructor构造方法类获取 Java-反射-不安全命令执行&反序列化链构造 思维导图 Java知识点 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;…

系统安全与网络攻击

系统安全与网络攻击 Web攻击 XSS 即&#xff08;Cross Site Scripting&#xff09;中文名称为&#xff1a;跨站脚本攻击。XSS的重点不在于跨站点&#xff0c;而在于脚本的执行。 XSS的攻击原理&#xff1a;恶意攻击者在web页面中会插入一些恶意的script代码。当用户浏览该页面的…

pytorch安装记录

pytorch安装记录 1 安装anconda2 安装pycharm3 安装显卡驱动4 根据显卡驱动版本下载CUDA5 cudnn安装6 根据CUDA版本安装pytorch7 pytorch卸载 1 安装anconda 下载地址: https://www.anaconda.com/download#downloads 验证是否安装成功&#xff1a;打开cmd, 输入 conda 验证环…

基于YOLOv8的手机摄像头的自动检测系统

文章大纲 数据集网络爬虫开源数据集标注目标定义标注标准标注工具标签更换脚本自制数据集下载地址自动检测系统设计与搭建模型训练与准确率代码仓库下载地址参考文献与学习路径随着移动通信技术的飞速发展,消费者对移动终端的要求也越来越高,各厂商纷纷提出自己的特色卖点,其…