Java實現(xiàn)遞歸刪除菜單和目錄及目錄下所有文件
一、什么是遞歸
遞歸調用是一種特殊的嵌套調用,是某個函數(shù)調用自己或者是調用其他函數(shù)后再次調用自己的,只要函數(shù)之間互相調用能產(chǎn)生循環(huán)的則一定是遞歸調用,遞歸調用一種解決方案,一種是邏輯思想,將一個大工作分為逐漸減小的小工作,比如說一個和尚要搬50塊石頭,他想,只要先搬走49塊,那剩下的一塊就能搬完了,然后考慮那49塊,只要先搬走48塊,那剩下的一塊就能搬完了,遞歸是一種思想,只不過在程序中,就是依靠函數(shù)嵌套這個特性來實現(xiàn)了。
遞歸調用就是在當前的函數(shù)中調用當前的函數(shù)并傳給相應的參數(shù),這是一個動作,這一動作是層層進行的,直到滿足一般情況的的時候,才停止遞歸調用,開始從最后一個遞歸調用返回。
二、示例分析
案例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-權限按鈕)*/ 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集合設置刪除菜單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; /** * 文件相關工具類 */ @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; } } }
到此這篇關于Java實現(xiàn)遞歸刪除菜單和目錄及目錄下所有文件的文章就介紹到這了,更多相關Java遞歸刪除文件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java多線程run方法中直接調用service業(yè)務類應注意的問題及解決
這篇文章主要介紹了Java多線程run方法中直接調用service業(yè)務類應注意的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06Java中final,finally,finalize?有什么區(qū)別
這篇文章主要給大家分享的是?Java中final,finally,finalize?到底有什么區(qū)別,文章圍繞final,finally,finalize的相關資料展開詳細內容,具有一定的參考的價值,需要的朋友可以參考一下2021-11-11基于servlet的執(zhí)行原理與生命周期(全面解析)
下面小編就為大家分享一篇servlet的執(zhí)行原理與生命周期全面解析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12java ArrayList集合中的某個對象屬性進行排序的實現(xiàn)代碼
這篇文章主要介紹了java ArrayList集合中的某個對象屬性進行排序的實現(xiàn)代碼,需要的朋友可以參考下2016-07-07SpringBoot2整合Ehcache組件實現(xiàn)輕量級緩存管理
EhCache是一個純Java的進程內緩存框架,具有快速、上手簡單等特點,是Hibernate中默認的緩存提供方。本文講述下SpringBoot2 整合Ehcache組件的步驟2021-06-06