1. 程式人生 > 其它 >java 向上、向下遞迴刪除多級空目錄(實用)

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);

測試結果 

寫在最後

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

 相關推薦: