亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java實現(xiàn)遞歸刪除菜單和目錄及目錄下所有文件

 更新時間:2025年03月04日 10:19:56   作者:Javaの甘乃迪  
這篇文章主要為大家詳細介紹了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中的LinkedBlockingQueue源碼解析

    Java中的LinkedBlockingQueue源碼解析

    這篇文章主要介紹了Java中的LinkedBlockingQueue源碼解析,LinkedBlockingQueue底層是一個鏈表(可以指定容量,默認是Integer.MAX_VALUE),維持了兩把鎖,一把鎖用于入隊,一把鎖用于出隊,并且使用一個AtomicInterger類型的變量保證線程安全,需要的朋友可以參考下
    2023-12-12
  • 使用GenericObjectPool避免泄漏設置方法

    使用GenericObjectPool避免泄漏設置方法

    這篇文章主要為大家介紹了使用GenericObjectPool避免泄漏的設置方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Java多線程run方法中直接調用service業(yè)務類應注意的問題及解決

    Java多線程run方法中直接調用service業(yè)務類應注意的問題及解決

    這篇文章主要介紹了Java多線程run方法中直接調用service業(yè)務類應注意的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java中final,finally,finalize?有什么區(qū)別

    Java中final,finally,finalize?有什么區(qū)別

    這篇文章主要給大家分享的是?Java中final,finally,finalize?到底有什么區(qū)別,文章圍繞final,finally,finalize的相關資料展開詳細內容,具有一定的參考的價值,需要的朋友可以參考一下
    2021-11-11
  • Java中的鎖分類的詳細介紹

    Java中的鎖分類的詳細介紹

    這篇文章主要介紹了Java中的鎖分類的詳細介紹,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Java中toString方法的深度解析與應用場景詳解

    Java中toString方法的深度解析與應用場景詳解

    這篇文章主要介紹了Java中的toString方法及其重寫的重要性和注意事項,包括信息的完整性、簡潔性、格式的統(tǒng)一性、避免性能問題和遞歸循環(huán)等問題,文中將解決的辦法介紹的非常詳細,需要的朋友可以參考下
    2025-04-04
  • 基于servlet的執(zhí)行原理與生命周期(全面解析)

    基于servlet的執(zhí)行原理與生命周期(全面解析)

    下面小編就為大家分享一篇servlet的執(zhí)行原理與生命周期全面解析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • PowerJob UseCacheLock工作流程源碼剖析

    PowerJob UseCacheLock工作流程源碼剖析

    這篇文章主要為大家介紹了PowerJob UseCacheLock工作流程源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • java ArrayList集合中的某個對象屬性進行排序的實現(xiàn)代碼

    java ArrayList集合中的某個對象屬性進行排序的實現(xiàn)代碼

    這篇文章主要介紹了java ArrayList集合中的某個對象屬性進行排序的實現(xiàn)代碼,需要的朋友可以參考下
    2016-07-07
  • SpringBoot2整合Ehcache組件實現(xiàn)輕量級緩存管理

    SpringBoot2整合Ehcache組件實現(xiàn)輕量級緩存管理

    EhCache是一個純Java的進程內緩存框架,具有快速、上手簡單等特點,是Hibernate中默認的緩存提供方。本文講述下SpringBoot2 整合Ehcache組件的步驟
    2021-06-06

最新評論