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);
測試結果
寫在最後
哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!