Java實現(xiàn)遞歸刪除菜單和目錄及目錄下所有文件
一、什么是遞歸
遞歸調(diào)用是一種特殊的嵌套調(diào)用,是某個函數(shù)調(diào)用自己或者是調(diào)用其他函數(shù)后再次調(diào)用自己的,只要函數(shù)之間互相調(diào)用能產(chǎn)生循環(huán)的則一定是遞歸調(diào)用,遞歸調(diào)用一種解決方案,一種是邏輯思想,將一個大工作分為逐漸減小的小工作,比如說一個和尚要搬50塊石頭,他想,只要先搬走49塊,那剩下的一塊就能搬完了,然后考慮那49塊,只要先搬走48塊,那剩下的一塊就能搬完了,遞歸是一種思想,只不過在程序中,就是依靠函數(shù)嵌套這個特性來實現(xiàn)了。
遞歸調(diào)用就是在當前的函數(shù)中調(diào)用當前的函數(shù)并傳給相應(yīng)的參數(shù),這是一個動作,這一動作是層層進行的,直到滿足一般情況的的時候,才停止遞歸調(diào)用,開始從最后一個遞歸調(diào)用返回。
二、示例分析
案例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;
/**
* 系統(tǒng)菜單
*/
@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-權(quán)限按鈕)*/
private Integer menuType;
/*** 菜單圖標*/
private String menuIcon;
/*** 菜單URL*/
private String menuUrl;
/*** 菜單序號*/
private Integer menuOrder;
/*** 菜單描述*/
private String menuDesc;
/*** 數(shù)據(jù)狀態(tài)(0-刪除 1-正常) */
private Integer dataFlag;
/*** 是否禁用(0-否 1-是)*/
private Integer isDisable;
/*** 創(chuàng)建人ID*/
private Long createId;
/*** 創(chuàng)建時間*/
private Date createTime;
}實現(xiàn)代碼
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("菜單已刪除");
}
// 創(chuàng)建list集合,用于封裝所有要刪除的菜單ID
List<Long> menuIdList = new ArrayList<>();
// 向menuIdList集合設(shè)置刪除菜單id(根據(jù)id刪除菜單)
this.queryMenuChildById(menuId, menuIdList);
// 把當前菜單id封裝到idList里面
menuIdList.add(menuId);
// 批量刪除當前菜單 及其所有子菜單
return menuMapper.deleteBatchIds(menuIdList);
}
// 根據(jù)當前菜單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:遞歸刪除目錄及其目錄中所有文件
實現(xiàn)代碼
import lombok.extern.slf4j.Slf4j;
import java.io.File;
/**
* 文件相關(guān)工具類
*/
@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) {
// 循環(huán)刪除
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;
}
}
}到此這篇關(guān)于Java實現(xiàn)遞歸刪除菜單和目錄及目錄下所有文件的文章就介紹到這了,更多相關(guān)Java遞歸刪除文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Cloud應(yīng)用實現(xiàn)配置自動刷新過程詳解
這篇文章主要介紹了Spring Cloud應(yīng)用實現(xiàn)配置自動刷新過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
SpringBoot2 整合MinIO中間件實現(xiàn)文件便捷管理功能
這篇文章主要介紹了SpringBoot2 整合MinIO中間件,實現(xiàn)文件便捷管理,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
簡單談?wù)凾hreadPoolExecutor線程池之submit方法
下面小編就為大家?guī)硪黄唵握務(wù)凾hreadPoolExecutor線程池之submit方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06
SpringBoot中的@Conditional?注解的使用
@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進行判斷,滿足條件的才給容器注冊Bean,本文主要介紹了SpringBoot中的@Conditional?注解的使用2024-01-01
一文教會你用mybatis查詢數(shù)據(jù)庫數(shù)據(jù)
MyBatis本身是一個數(shù)據(jù)庫連接框架,可以認為是JDBC的升級版,下面這篇文章主要給大家介紹了關(guān)于mybatis查詢數(shù)據(jù)庫數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2022-04-04
簡介Java的Spring框架的體系結(jié)構(gòu)以及安裝配置
這篇文章主要介紹了Java的Spring框架的體系結(jié)構(gòu)以及安裝配置,Spring框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12

