Cách copy thư mục trong Java

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]
0 0 votes
Đánh giá bài viết
Nhận thông báo
Thông báo khi có
guest

0 Bình luận
Phản hồi nội tuyến
Xem tất cả các bình luận