สมมติมีโฟลเดอร์ 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() + Recursion | 1.0+ | ต่ำ | Manual |
| Files.walkFileTree | 7+ | ปานกลาง | ดี (Visitor pattern) |
| Files.walk + Stream | 8+ | ต่ำมาก | จำกัด |