項目中目錄信息存 DB 表、文件信息存另一表。刪除目錄需:**先刪 DB 記錄(目錄+子目錄、文件),再遞歸刪物理文件**。
// 1. 刪除數據庫目錄信息(含遞歸子目錄)
catalogueDAO.deleteCat(dir);
// 2. 刪除數據庫文件信息
fileDAO.deleteFile(dir);
// 3. 遞歸刪除物理目錄及文件
deleteDir(physicalPath + dir.getName());
public static void deleteDir(String path) {
File file = new File(path);
if (file.exists()) {
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files != null) { // 防御性編程:listFiles() 可能返回 null
for (File subFile : files) {
if (subFile.isDirectory()) {
deleteDir(subFile.getPath()); // 遞歸刪子目錄
} else {
subFile.delete(); // 刪除文件
}
}
}
}
file.delete(); // 最後刪除當前目錄(必須為空)
}
}
File.delete() 返回 boolean,**建議檢查返回值並記錄日志**File 操作跟隨鏈接,可能誤刪目標,生產環境建議用 NIO.2 Files.walkFileTree 精確控制
import java.nio.file.*;
import java.io.IOException;
public static void deleteDirNIO(Path path) throws IOException {
Files.walkFileTree(path, 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 {
Files.delete(dir); // 目錄為空後刪目錄
return FileVisitResult.CONTINUE;
}
});
}
FileVisitOption.FOLLOW_LINKS)遞歸刪除目錄看似簡單,**順序、空指針、失敗靜默、符號鏈接、深度、併發** 皆是坑。現代項目**首選 NIO.2 Files.walkFileTree**,舊代碼維護時務必加上非空判斷、返回值檢查、日志記錄三大保護。