Java實(shí)現(xiàn)遞歸刪除菜單和目錄及目錄下所有文件
一、什么是遞歸
遞歸調(diào)用是一種特殊的嵌套調(diào)用,是某個(gè)函數(shù)調(diào)用自己或者是調(diào)用其他函數(shù)后再次調(diào)用自己的,只要函數(shù)之間互相調(diào)用能產(chǎn)生循環(huán)的則一定是遞歸調(diào)用,遞歸調(diào)用一種解決方案,一種是邏輯思想,將一個(gè)大工作分為逐漸減小的小工作,比如說(shuō)一個(gè)和尚要搬50塊石頭,他想,只要先搬走49塊,那剩下的一塊就能搬完了,然后考慮那49塊,只要先搬走48塊,那剩下的一塊就能搬完了,遞歸是一種思想,只不過(guò)在程序中,就是依靠函數(shù)嵌套這個(gè)特性來(lái)實(shí)現(xiàn)了。
遞歸調(diào)用就是在當(dāng)前的函數(shù)中調(diào)用當(dāng)前的函數(shù)并傳給相應(yīng)的參數(shù),這是一個(gè)動(dòng)作,這一動(dòng)作是層層進(jìn)行的,直到滿(mǎn)足一般情況的的時(shí)候,才停止遞歸調(diào)用,開(kāi)始從最后一個(gè)遞歸調(diào)用返回。
二、示例分析
案例1:遞歸刪除菜單及其所有子菜單
菜單實(shí)體類(lèi)
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; /*** 父級(jí)菜單ID*/ private Long upMenuId; /*** 菜單編碼*/ private String menuCode; /*** 菜單名稱(chēng)*/ private String menuName; /*** 菜單級(jí)別(默認(rèn)1級(jí))*/ private Integer menuLevel; /*** 菜單頁(yè)面打開(kāi)方式(1-本頁(yè)面打開(kāi) 2 新標(biāo)簽頁(yè)打開(kāi) 3-新窗口打開(kāi))*/ private Integer pageOpenType; /*** 菜單類(lèi)型(1-菜單 2-權(quán)限按鈕)*/ private Integer menuType; /*** 菜單圖標(biāo)*/ private String menuIcon; /*** 菜單URL*/ private String menuUrl; /*** 菜單序號(hào)*/ 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)建時(shí)間*/ private Date createTime; }
實(shí)現(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) { // 校驗(yàn)當(dāng)前要?jiǎng)h除的菜單是否存在 Menu menu = menuMapper.selectById(menuId); if (null == menu) { throw new RuntimeException("菜單已刪除"); } // 創(chuàng)建list集合,用于封裝所有要?jiǎng)h除的菜單ID List<Long> menuIdList = new ArrayList<>(); // 向menuIdList集合設(shè)置刪除菜單id(根據(jù)id刪除菜單) this.queryMenuChildById(menuId, menuIdList); // 把當(dāng)前菜單id封裝到idList里面 menuIdList.add(menuId); // 批量刪除當(dāng)前菜單 及其所有子菜單 return menuMapper.deleteBatchIds(menuIdList); } // 根據(jù)當(dāng)前菜單id,查詢(xún)其所有子菜單id,再封裝到idList集合 private void queryMenuChildById(Long menuId, List<Long> idList) { // 查詢(xún)菜單里面子菜單id QueryWrapper<Menu> wrapper = new QueryWrapper<>(); wrapper.eq("up_menu_id", menuId); List<Menu> childMenuList = menuMapper.selectList(wrapper); if (!CollectionUtils.isEmpty(childMenuList)) { // 把childMenuList里面菜單id值獲取出來(lái),封裝idList里面,做遞歸查詢(xún) childMenuList.forEach(item -> { //封裝idList里面 idList.add(item.getMenuId()); //遞歸查詢(xún) this.queryMenuChildById(item.getMenuId(), idList); }); } } }
案例2:遞歸刪除目錄及其目錄中所有文件
實(shí)現(xiàn)代碼
import lombok.extern.slf4j.Slf4j; import java.io.File; /** * 文件相關(guān)工具類(lèi) */ @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)) { // 補(bǔ)齊文件分隔符 path = path + File.separator; } File directoryFile = new File(path); // 文件不存在、不是一個(gè)目錄就打印退出返回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; } // 最后刪除當(dāng)前文件夾 if (directoryFile.delete()) { log.info("刪除文件夾成功,{}", path); return true; } else { log.info("刪除文件夾失敗,{}", path); return false; } } }
到此這篇關(guān)于Java實(shí)現(xiàn)遞歸刪除菜單和目錄及目錄下所有文件的文章就介紹到這了,更多相關(guān)Java遞歸刪除文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用GenericObjectPool避免泄漏設(shè)置方法
這篇文章主要為大家介紹了使用GenericObjectPool避免泄漏的設(shè)置方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Java多線程run方法中直接調(diào)用service業(yè)務(wù)類(lèi)應(yīng)注意的問(wèn)題及解決
這篇文章主要介紹了Java多線程run方法中直接調(diào)用service業(yè)務(wù)類(lèi)應(yīng)注意的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06Java中final,finally,finalize?有什么區(qū)別
這篇文章主要給大家分享的是?Java中final,finally,finalize?到底有什么區(qū)別,文章圍繞final,finally,finalize的相關(guān)資料展開(kāi)詳細(xì)內(nèi)容,具有一定的參考的價(jià)值,需要的朋友可以參考一下2021-11-11Java中toString方法的深度解析與應(yīng)用場(chǎng)景詳解
這篇文章主要介紹了Java中的toString方法及其重寫(xiě)的重要性和注意事項(xiàng),包括信息的完整性、簡(jiǎn)潔性、格式的統(tǒng)一性、避免性能問(wèn)題和遞歸循環(huán)等問(wèn)題,文中將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04基于servlet的執(zhí)行原理與生命周期(全面解析)
下面小編就為大家分享一篇servlet的執(zhí)行原理與生命周期全面解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12java ArrayList集合中的某個(gè)對(duì)象屬性進(jìn)行排序的實(shí)現(xiàn)代碼
這篇文章主要介紹了java ArrayList集合中的某個(gè)對(duì)象屬性進(jìn)行排序的實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-07-07SpringBoot2整合Ehcache組件實(shí)現(xiàn)輕量級(jí)緩存管理
EhCache是一個(gè)純Java的進(jìn)程內(nèi)緩存框架,具有快速、上手簡(jiǎn)單等特點(diǎn),是Hibernate中默認(rèn)的緩存提供方。本文講述下SpringBoot2 整合Ehcache組件的步驟2021-06-06