項目中常需清理臨時目錄、日誌舊文件等。Java File.delete() 僅能刪除空目錄或單個文件,需配合遞歸實現「刪除非空目錄及其所有子文件」。
public void deleteFile(File path) {
if (path.isDirectory()) {
File[] files = path.listFiles();
if (files != null) {
for (File file : files) deleteFile(file); // 遞歸處理子項
}
} else {
path.delete(); // 刪除文件
}
// 可選:刪除空目錄本身 path.delete();
}
package org.sw;
import java.io.File;
public class DeleteFolder {
public void deleteFile(File oldPath) {
if (oldPath.isDirectory()) {
System.out.println(oldPath + " 是文件夾");
File[] files = oldPath.listFiles();
if (files != null) {
for (File file : files) deleteFile(file);
}
} else {
oldPath.delete();
}
}
public static void main(String[] args) {
new DeleteFolder().deleteFile(new File("E:/ddd/"));
}
}
listFiles() 可能返回 null(無權限/非目錄),需判空Files.isSymbolicLink() 判斷Files.walkFileTree (NIO.2)path.delete()import java.nio.file.*;
import java.io.IOException;
Files.walkFileTree(Paths.get("E:/ddd"), new SimpleFileVisitor<Path>() {
@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 {
Files.delete(dir); return FileVisitResult.CONTINUE;
}
});
NIO.2 版本自動處理符號鏈接、權限異常,且無棧溢出風險,推薦生產環境使用。
遞歸刪除雖簡單但需注意邊界條件;現代項目優先選 Files.walkFileTree,舊項目維護時加上判空與符號鏈接檢查即可安全上線。