Sao Chép Thư Mục
(Copying Directory)

Sao chép một thư mục trong Java yêu cầu xử lý đặc biệt hơn so với việc sao chép một tệp tin đơn lẻ, bởi vì bạn cần sao chép đệ quy toàn bộ nội dung của thư mục (bao gồm cả các tệp tin và thư mục con bên trong).

Lưu ý quan trọng:

↳ Thư mục: Khi sao chép một thư mục, các tệp bên trong thư mục đó sẽ không được sao chép. Do đó, thư mục mới sẽ trống ngay cả khi thư mục gốc chứa các tệp tin.

Ví dụ 1

Nếu bạn muốn chỉ sao chép thư mục mà không sao chép các thư mục con và tệp bên trong, bạn chỉ cần tạo một thư mục đích tương ứng mà không cần sử dụng đệ quy để duyệt qua các thư mục con. Dưới đây là ví dụ về cách thực hiện điều này:

Ví dụ: Example.java

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

public class Example {
    public static void main(String[] args) {
        Path sourceDir = Paths.get("path/to/source/directory");
        Path targetDir = Paths.get("path/to/target/directory");

        try {
            // Tạo thư mục đích tương ứng
            Files.createDirectory(targetDir.resolve(sourceDir.getFileName()));
            System.out.println("Thư mục đã được sao chép thành công.");
        } catch (FileAlreadyExistsException e) {
            System.err.println("Thư mục đích đã tồn tại.");
        } catch (IOException e) {
            System.err.println("Không thể sao chép thư mục: " + e.getMessage());
        }
    }
}

Kết quả của chương trình là:

Thư mục sourceDir sẽ được sao chép vào targetDir mà không sao chép các tệp hoặc thư mục con bên trong.
Nếu thư mục đích đã tồn tại, sẽ có thông báo lỗi "Target directory already exists."

Ví dụ 2

Dưới đây là ví dụ về cách sao chép một thư mục bằng cách sử dụng phương thức Files.walkFileTree() để đi qua tất cả các tệp và thư mục con bên trong:

Ví dụ: Example.java

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

public class Example {
    public static void main(String[] args) {
        // Đường dẫn tới thư mục nguồn cần sao chép
        Path sourceDir = Paths.get("path/to/source/directory");
        // Đường dẫn tới thư mục đích nơi muốn sao chép
        Path targetDir = Paths.get("path/to/target/directory");

        try {
            // Duyệt qua cây thư mục (tất cả các thư mục con và tệp) bắt đầu từ thư mục nguồn
            Files.walkFileTree(sourceDir, new SimpleFileVisitor<Path>() {
                
                // Xử lý trước khi vào thăm mỗi thư mục
                @Override
                public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                    // Tính toán đường dẫn đích tương ứng với thư mục hiện tại
                    Path targetPath = targetDir.resolve(sourceDir.relativize(dir));
                    // Nếu thư mục đích chưa tồn tại, tạo thư mục đó
                    if (!Files.exists(targetPath)) {
                        Files.createDirectory(targetPath);
                    }
                    // Tiếp tục duyệt cây thư mục
                    return FileVisitResult.CONTINUE;
                }

                // Xử lý mỗi khi gặp một tệp trong quá trình duyệt cây thư mục
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                    // Tính toán đường dẫn đích tương ứng với tệp hiện tại
                    Path targetPath = targetDir.resolve(sourceDir.relativize(file));
                    // Sao chép tệp tới thư mục đích, ghi đè nếu tệp đã tồn tại
                    Files.copy(file, targetPath, StandardCopyOption.REPLACE_EXISTING);
                    // Tiếp tục duyệt cây thư mục
                    return FileVisitResult.CONTINUE;
                }
            });
            // In thông báo khi quá trình sao chép hoàn tất thành công
            System.out.println("Thư mục đã được sao chép thành công.");
        } catch (IOException e) {
            // In thông báo lỗi nếu xảy ra lỗi trong quá trình sao chép
            System.err.println("Không thể sao chép thư mục: " + e.getMessage());
        }
    }
}

Kết quả của chương trình là:

Thư mục và tất cả các tệp, thư mục con bên trong nó sẽ được sao chép từ sourceDir sang targetDir.
Nếu có bất kỳ tệp hoặc thư mục nào đã tồn tại ở đích, nó sẽ bị ghi đè.

Hy vọng rằng qua các ví dụ trên, bạn sẽ hiểu rõ hơn về cách sao chép thư mục trong Java.

Câu Nói Truyền Cảm Hứng

“Bắt đầu ở đâu không quan trọng, quan trọng là bạn sẵn sàng bắt đầu.” – W. Clement Stone

Không Gian Tích Cực

“Chúc bạn luôn giữ vững niềm tin và sức mạnh để vượt qua mọi thử thách trong cuộc sống.”