在 Java 開發中,遞迴刪除資料夾及其內部所有檔案是常見的檔案操作需求。本文提供一個完整、可直接使用的工具類實作,涵蓋刪除單一檔案、清空資料夾內容、以及連同資料夾本身一併刪除的完整邏輯。
刪除非空資料夾的關鍵在於「遞迴」:必須先刪除資料夾內的所有檔案與子資料夾,待資料夾變為空狀態後,才能成功呼叫 File.delete() 移除資料夾本身。以下程式碼展示了標準的雙方法協作模式:
import java.io.File;
public class FolderDeleter {
public static void main(String[] args) {
String targetPath = "c:/bb"; // 修改為您要刪除的資料夾路徑
delFolder(targetPath);
System.out.println("資料夾刪除完成:" + targetPath);
}
/**
* 刪除資料夾及其內部所有內容
* @param folderPath 資料夾完整絕對路徑
*/
public static void delFolder(String folderPath) {
try {
// 1. 先刪除資料夾裡的所有檔案與子資料夾
delAllFile(folderPath);
// 2. 再刪除空的資料夾本身
File folder = new File(folderPath);
if (folder.delete()) {
System.out.println("資料夾已刪除:" + folderPath);
} else {
System.err.println("資料夾刪除失敗(可能非空或權限不足):" + folderPath);
}
} catch (Exception e) {
System.err.println("刪除過程發生異常:" + e.getMessage());
e.printStackTrace();
}
}
/**
* 遞迴刪除指定路徑下的所有檔案與子資料夾
* @param path 目標資料夾路徑
* @return 是否有檔案被刪除
*/
public static boolean delAllFile(String path) {
boolean flag = false;
File dir = new File(path);
// 路徑不存在或不是資料夾,直接返回
if (!dir.exists() || !dir.isDirectory()) {
return flag;
}
// 取得資料夾下所有檔案/子資料夾
File[] files = dir.listFiles();
if (files == null || files.length == 0) {
return flag; // 空資料夾
}
for (File file : files) {
if (file.isFile()) {
// 直接刪除檔案
if (file.delete()) {
flag = true;
System.out.println("已刪除檔案:" + file.getAbsolutePath());
} else {
System.err.println("檔案刪除失敗:" + file.getAbsolutePath());
}
} else if (file.isDirectory()) {
// 遞迴處理子資料夾
delAllFile(file.getAbsolutePath());
// 子資料夾清空後,刪除該空資料夾
if (file.delete()) {
flag = true;
System.out.println("已刪除空資料夾:" + file.getAbsolutePath());
}
}
}
return flag;
}
}
listFiles() 而非 list()原始碼中使用 file.list() 回傳字串陣列,需手動拼接路徑,容易出錯。現代寫法建議直接用 listFiles() 取得 File 物件陣列,程式碼更簡潔、型別安全,且自動處理路徑分隔符。
delete() 的布林回傳值,區分「刪除成功」與「失敗(權限不足、檔案被鎖定等)」。Files.walkFileTree (NIO.2) 獲得更細緻的控制。若專案使用 Java 7 或更新版本,強烈建議改用 java.nio.file.Files 配合 SimpleFileVisitor,程式碼更簡潔且功能更強大:
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class ModernFolderDeleter {
public static void deleteFolder(Path folder) throws IOException {
Files.walkFileTree(folder, new SimpleFileVisitor() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Files.delete(file); // 刪除檔案
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
if (exc == null) {
Files.delete(dir); // 刪除空資料夾
return FileVisitResult.CONTINUE;
} else {
throw exc;
}
}
});
}
}
delete() 會失敗返回 false,不會拋出例外,務必檢查回傳值。listFiles() 會跟隨符號連結,遞迴刪除時需謹慎,避免誤刪連結目標外的資料。刪除資料夾及其內容看似簡單,實際生產環境中需考慮錯誤處理、權限、併發鎖定等細節。傳統 IO 寫法適用於舊版本 Java 維護專案;新專案建議直接採用 NIO.2 Files.walkFileTree,程式碼更健壯、可讀性更高,且能輕鬆擴展過濾條件(如僅刪除特定副檔名、保留近期檔案等)。