java 向上、向下遞歸刪除多級空目錄(實用)


1.情景展示

在實際開發過程當中,對於文件目錄或者文件進行操作,是不可避免的,可能會遇到兩個問題:

問題1:如何通過java刪除多個下級空目錄?

問題2:如何通過java刪除多個上級空目錄?

2.具體分析

在開始之前,我們需要了解java刪除目錄所需達成的條件。

舉個栗子:

我們想要通過java刪除文件目錄:3,如何操作?

測試一:直接刪除目錄3;

通過上圖代碼運行結果,可以發現:

當目錄3下有子目錄的時候,在java當中,是無法直接刪除目錄3的;

測試二:直接刪除目錄4;

通過上圖代碼運行結果,可以發現:

當目錄4下有子文件時,在java當中,是無法直接刪除目錄4的;

小結:

要想通過java刪除一個目錄,必須要確保它是一個空目錄;

換句話說就是:要想刪除本目錄,必須先刪除它下屬的子文件以及子目錄。

所以要想刪除成功,需要用到java當中的遞歸。

3.刪除多個下級空目錄

這里只考慮目錄下面有子空白目錄的情形,不考慮目錄下面還有子文件的情況。

在實際開發過程中,我也沒有遇到過這種需求,網上也都是這樣的案例。

此時,目錄2,3,4都是空目錄,如何將其刪除掉?

方式一:

/**
 * 遞歸刪除多級空子目錄
 * @explain
 * @param file
 */
public static void removeChildrenEmptyDirectory(File file) {
    File[] fileList = file.listFiles();
    for (File f : fileList) {//遍歷集合
        if (f.isDirectory()) {//判斷是目錄
            //遞歸調用,直到找到最下級目錄才執行刪除操作(從最下級開始往上級刪除)
            removeChildrenEmptyDirectory(f);
            //刪除本目錄
            System.out.println(f.delete());

        }
    }
    
}

測試:

public static void main(String[] args) {
    String filepath = "D:\\workspace-eclipse2021\\TWRS2.1\\web\\uploadfile\\2";
    File file = new File(filepath);
    if (file.exists()) {//判斷路徑是否存在
        removeChildrenEmptyDirectory(file);
        // 刪除本級目錄
        if (file.isDirectory()) {
            file.delete();
        }
    }
    
}

測試結果: 

方式二:java8

重新創建多級目錄

多個目錄使用/分開

public static boolean removeChildrenEmptyDirectory2(File file) {
    // 子目錄遞歸調用本方法
    Arrays.asList(file.listFiles()).forEach(Test::removeChildrenEmptyDirectory2);
    // 執行刪除命令
    return file.delete();
}

調用

String filepath = "D:\\workspace-eclipse2021\\TWRS2.1\\web\\uploadfile\\2";
File file = new File(filepath);
if (file.exists()) {//判斷路徑是否存在
    removeChildrenEmptyDirectory2(file);
    // 刪除本級目錄
    file.delete();
}

執行效果與方式一一模一樣,都會將目錄2進行刪除。

4.刪除多個上級空目錄

我在實際開發當中,用到的是這個,即:

文件既然支持用戶上傳,必然有支持刪除的需求;

當將上傳的文件進行刪除時,如果我們只刪除對應的文件內容的話,會導致:生成的空目錄文件越來多。

所以,我們需要在文件刪除的時候,檢測它的上級目錄是否也是空的,如果是空的,就將其刪掉。

代碼實現

/**
 * 遞歸刪除父級空目錄
 * @explain
 * @param parentPath
 */
public static void removeEmptyParentsDirectory(String parentPath) {
    File parentFile = new File(parentPath);
    // 父級目錄里沒有子文件
    if (parentFile.listFiles().length < 1) {
        // 刪除本級目錄
        if (parentFile.delete()) {
            // 並進一步獲取上級目錄
            removeEmptyParentsDirectory(parentFile.getParent());
        }
    }
    
}

調用:

public static void main(String[] args) {
    String filepath = "D:\\workspace-eclipse2021\\TWRS2.1\\web\\uploadfile\\1\\2\\3\\4\\5\\1650182300616.png";
    File file = new File(filepath);
    // 文件存在並且是文件
    if (file.exists() && file.isFile()) {//判斷路徑是否存在
        if (file.delete()) {// 刪除硬盤文件
            // 刪除父級空目錄
            removeEmptyParentsDirectory(file.getParent());
        }
    }
}

測試1:

結果1:本文件及父級空目錄全部刪除

 

測試2:

結果2:文件被刪除,且它的上級目錄5也被刪除,組父級目錄4,由於它有子文件,所以得以保留。

5.刪除多級下級目錄及文件

雖然上面有刪除多個下級目錄的方法,但是,也僅僅局限於下級目錄是空白目錄;

當我們想刪除下級目錄,而不管它還有沒有下屬的子目錄或者子文件時,如何實現?

不管下級有目錄還是文件,統統刪除。

方式一:

/**
 * 遞歸刪除多級子目錄及子文件
 * @explain
 * @param file
 */
public static void removeChildren(File file) {
    File[] fileList = file.listFiles();
    for (File f : fileList) {//遍歷集合
        if (f.isDirectory()) {//判斷是目錄
            //遞歸調用,直到找到最下級目錄才執行刪除操作(從最下級開始往上級刪除)
            removeChildren(f);
        }
        // 刪除子目錄及子文件
        f.delete();
    }
}

調用

String filepath = "D:\\workspace-eclipse2021\\TWRS2.1\\web\\uploadfile\\2";
File file = new File(filepath);
removeChildren(file);

方式二:

/**
 * 刪除子目錄及子文件
 * @explain 遞歸刪除
 * @param file
 * @return
 */
public static boolean removeChildren2(File file) {
    Arrays.asList(file.listFiles()).forEach(f -> {
        // 如果是子目錄,遞歸調用本方法,直到下方沒有目錄為止
        if (f.isDirectory()) {
            removeChildren2(f);
        }
        // 當下方沒有目錄時,執行刪除命令(子文件和子目錄都會被刪除) 
        f.delete();
    });
    return true;
}

調用

String filepath = "D:\\workspace-eclipse2021\\TWRS2.1\\web\\uploadfile\\2";
File file = new File(filepath);
removeChildren2(file);

測試結果 

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

 相關推薦:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM