首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 遞歸刪除目錄完整實戰代碼

     編輯:Java 相關知識

業務場景

項目中目錄信息存 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(); // 最後刪除當前目錄(必須為空)
    }
}

關鍵細節與避坑指南

  1. 順序關鍵:先遞歸刪子目錄/文件,**最後刪父目錄**(目錄非空無法刪除)
  2. listFiles() 可能返回 null:無權限、非目錄、IO 錯誤時返回 null,**必須非空判斷**
  3. 刪除失敗不拋異常:File.delete() 返回 boolean,**建議檢查返回值並記錄日志**
  4. 符號鏈接:File 操作跟隨鏈接,可能誤刪目標,生產環境建議用 NIO.2 Files.walkFileTree 精確控制
  5. 大目錄性能:遞歸深度過大棧溢出風險,百萬級文件建議迭代式/流式處理
  6. 併發安全:多線程並發刪除同一目錄會衝突,需分布式鎖/文件鎖保護

現代化改造:NIO.2 (Java 7+)


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**,舊代碼維護時務必加上非空判斷、返回值檢查、日志記錄三大保護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved