Khi copy một thư mục sang một thư mục khác, không đơn thuần bạn chỉ copy mỗi thư mục rỗng không thôi mà phải copy thư mục đó kèm theo các thư mục con, các file có chứa trong thư mục đó nếu có. Muốn thực hiện được chúng ta phải sử dụng phương pháp đệ quy
.
Dưới đây là ví dụ copy thư mục và tất cả thư mục con, các file chứa trong thư mục đó sang một thư mục khác. Đoạn code Java bên dưới mình đã comment dễ hiểu nhất, nếu không hiểu hay còn thắc mắc ở đoạn nào thì comment bên dưới bài viết để chúng ta cùng bàn luận nhé.
Ví dụ copy thư mục trong Java
Copy thư mục “c:\\ngockhuong” và tất cả thư mục con, các file của nó sang thư mục mới “c:\\ngockhuong-new”
package com.ngockhuong; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class CopyDirectoryExample { public static void main(String[] args) { // thư mục cần copy (thư mục nguồn) File srcFolder = new File("c:\\ngockhuong"); // thư mục muốn copy đến (thư mục đích) File destFolder = new File("c:\\ngockhuong-new"); // kiểm tra thư mục muốn copy đã tồn tại hay chưa if (!srcFolder.exists()) { System.out.println("Thư mục chưa tồn tại."); // thoát chương trình System.exit(0); } else { try { // sử dụng phương thức copyFolder được viết bên dưới copyFolder(srcFolder, destFolder); } catch (IOException e) { e.printStackTrace(); // có lỗi, thoát chương trình ngay System.exit(0); } } System.out.println("Copy xong"); } /** * Phương thức copy thư mục sử dụng đệ quy * * @param src * @param dest * @throws IOException */ public static void copyFolder(File src, File dest) throws IOException { // src: đối tượng nguồn (thư mục, file cần copy) // dest: đối tượng đích (thư mục đích) // kiểm tra đối tượng có phải là thư mục không if (src.isDirectory()) { // kiểm tra thư mục đích có tồn tại hay không, nếu không tồn tại thì // tạo mới if (!dest.exists()) { dest.mkdir(); System.out.println("Thư mục được copy từ " + src + " đến " + dest); } // lấy danh sách tên các thư mục, file chứa trong thư mục nguồn String files[] = src.list(); for (String file : files) { // tạo ra các đối tượng thuộc lớp File cho các file và thư mục // từ danh sách đã get ở trên File srcFile = new File(src, file); File destFile = new File(dest, file); // thực hiện đệ quy (gọi lại phương thức copyFolder) copyFolder(srcFile, destFile); } } else { // nếu là file thì thực hiện copy // ý tưởng copy file ở đây là đọc nội dung file // sau đó ghi nội dung file đó vào file ở thư mục đích // Sử dụng bytes stream để hỗ trợ việc đọc tất cả các file InputStream in = new FileInputStream(src); OutputStream out = new FileOutputStream(dest); byte[] buffer = new byte[1024]; int length; // đọc file dưới dạng byte // sau đó ghi vào file đích while ((length = in.read(buffer)) > 0) { out.write(buffer, 0, length); } // đóng luồng in.close(); out.close(); System.out.println("File được copy from " + src + " đến " + dest); } } }
Kết quả
Thư mục được copy từ c:\ngockhuong đến c:\ngockhuong-new Thư mục được copy từ c:\ngockhuong/assets đến c:\ngockhuong-new/assets Thư mục được copy từ c:\ngockhuong/assets/css đến c:\ngockhuong-new/assets/css File được copy from c:\ngockhuong/assets/css/animate.min.css đến c:\ngockhuong-new/assets/css/animate.min.css Thư mục được copy từ c:\ngockhuong/assets/fonts đến ngockhuong-new/assets/fonts File được copy from c:\ngockhuong/assets/fonts/themify.eot đến c:\ngockhuong-new/assets/fonts/themify.eot File được copy from c:\ngockhuong/assets/fonts/themify.svg đến c:\ngockhuong-new/assets/fonts/themify.svg File được copy from c:\ngockhuong/edit.html đến c:\ngockhuong-new/edit.html File được copy from c:\ngockhuong/index.html đến c:\ngockhuong-new/index.html ... Copy xong[alert-success]
Ý tưởng cho bạn
Sau ví dụ này bạn có thể viết một chương trình copy file hàng loạt cho riêng mình 🙂
[/alert-success]