專案中常需刪除整個目錄樹(包含子目錄與檔案),Java File.delete() 僅能刪除空目錄,需自行實作遞歸刪除邏輯。
public class FileUtils {
/** 統一入口:刪除檔案或目錄(含子內容) */
public boolean delete(String path) {
File file = new File(path);
if (!file.exists()) return false;
return file.isFile() ? deleteFile(file) : deleteDirectory(file);
}
/** 刪除單一檔案 */
private boolean deleteFile(File file) {
if (file.isFile() && file.exists()) {
return file.delete();
}
return false;
}
/** 遞歸刪除目錄及其所有內容 */
private boolean deleteDirectory(File dir) {
if (!dir.isDirectory()) return false;
File[] files = dir.listFiles();
if (files != null) {
for (File f : files) {
if (f.isFile()) {
if (!deleteFile(f)) return false;
} else {
if (!deleteDirectory(f)) return false;
}
}
}
// 刪除空目錄本身
return dir.delete();
}
}
File.separator,避免路徑拼接錯誤listFiles() 可能回傳 null,需判空[A-Za-z]:\\\\[^:?\"><*]* 初步校驗public static void main(String[] args) {
FileUtils utils = new FileUtils();
// 建立測試目錄結構
String testDir = "D:\\Test\\Sub\\Folder";
new File(testDir).mkdirs();
new File(testDir, "file.txt").createNewFile();
// 執行刪除
boolean result = utils.delete("D:\\Test");
System.out.println("刪除結果:" + result); // true
}
現代專案建議使用 NIO.2 更簡潔:
Files.walkFileTree(Paths.get(path), new SimpleFileVisitor<Path>() {
@Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
Files.delete(file); return FileVisitResult.CONTINUE;
}
@Override public FileVisitResult postVisitDirectory(Path dir, IOException e) {
Files.delete(dir); return FileVisitResult.CONTINUE;
}
});