欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2025年03月04日 10:19:56   作者:Javaの甘乃迪  
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)遞歸刪除菜單和刪除目錄及目錄下所有文件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下

一、什么是遞歸

遞歸調(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)文章

最新評(píng)論