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à:
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à:
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.