Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

โปรแกรม Java ลบไฟล์ทั้งหมดในโฟลเดอร์แบบ Recursive (เฉพาะไฟล์)

สมมติมีโฟลเดอร์ ExampleDirectory ในไดรฟ์ D โครงสร้างดังนี้:

  • 7 ไฟล์ในระดับบนสุด
  • 2 โฟลเดอร์ย่อย: SampleDirectory1 (2 ไฟล์), SampleDirectory2 (2 ไฟล์)

โค้ดลบไฟล์ทั้งหมด (Recursive)


import java.io.File;
import java.io.IOException;

public class DeletingAllFiles {
    public static void deleteFiles(File dirPath) {
        File[] filesList = dirPath.listFiles();
        if (filesList == null) return; // ไดเรกทอรีไม่มีอยู่หรือไม่ใช่ directory
        
        for (File file : filesList) {
            if (file.isFile()) {
                boolean deleted = file.delete();
                if (!deleted) {
                    System.err.println("Failed to delete: " + file.getAbsolutePath());
                }
            } else {
                deleteFiles(file); // recursive call สำหรับ subdirectory
            }
        }
    }
    
    public static void main(String[] args) throws IOException {
        File dir = new File("D:\\ExampleDirectory");
        deleteFiles(dir);
        System.out.println("Files deleted........");
    }
}

ผลลัพธ์


Files deleted........

การปรับปรุงสำหรับ Production

1. ใช้ Java NIO.2 (Files.walkFileTree) - แนะนำสำหรับ Java 7+


import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

public class DeleteFilesNIO {
    public static void main(String[] args) throws IOException {
        Path dir = Paths.get("D:\\ExampleDirectory");
        
        Files.walkFileTree(dir, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                Files.delete(file); // ลบไฟล์
                System.out.println("Deleted: " + file);
                return FileVisitResult.CONTINUE;
            }
            
            @Override
            public FileVisitResult visitFileFailed(Path file, IOException exc) {
                System.err.println("Failed to access: " + file + " - " + exc.getMessage());
                return FileVisitResult.CONTINUE;
            }
        });
        System.out.println("All files deleted.");
    }
}

2. Java 8+ Stream API (สั้นกว่า แต่ไม่ handle error ได้ละเอียด)


import java.io.IOException;
import java.nio.file.*;
import java.util.stream.Stream;

public class DeleteFilesStream {
    public static void main(String[] args) throws IOException {
        Path dir = Paths.get("D:\\ExampleDirectory");
        
        try (Stream<Path> stream = Files.walk(dir)) {
            stream.filter(Files::isRegularFile)
                  .forEach(path -> {
                      try {
                          Files.delete(path);
                          System.out.println("Deleted: " + path);
                      } catch (IOException e) {
                          System.err.println("Failed: " + path + " - " + e.getMessage());
                      }
                  });
        }
        System.out.println("Done.");
    }
}

ข้อควรระวัง

  • File.delete() คืนค่า boolean - ต้องเช็คผลลัพธ์เสมอ
  • ไฟล์ที่ถูกล็อกโดย process อื่น ลบไม่ได้ (Windows)
  • Permission denied - ต้องมีสิทธิ์ write ในโฟลเดอร์
  • โค้ดต้นฉบับไม่ลบโฟลเดอร์ว่างที่เหลือ - ใช้ Files.delete() บน directory หลังลบไฟล์ครบ

สรุป

วิธีJava Versionความซับซ้อนError Handling
File.listFiles() + Recursion1.0+ต่ำManual
Files.walkFileTree7+ปานกลางดี (Visitor pattern)
Files.walk + Stream8+ต่ำมากจำกัด