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);
測試結果