【I/O流】把一个文件夹里的所有文件包括文件夹 一并原样拷贝到另一个目录中...

本文介绍了一个简单的Java程序,用于将一个文件夹内的所有文件及子文件夹完整复制到另一个指定目录。程序通过递归方式遍历源文件夹,并在目标位置创建相同的文件夹结构,同时复制所有文件。

该文件夹下有子文件夹(子文件夹里又有文件)、文件(包括图片、文本文件)···

/**
 * 把一个文件夹里的所有文件包括文件夹 一并原样拷贝到另一个目录中; 
 *@author 小苗
 */
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class CopyDir001 {

	private  File dirFrom;
	private  File dirTo;

	public CopyDir001(File dirFrom, File dirTo) {
		super();
		this.dirFrom = dirFrom;
		this.dirTo = dirTo;
	}
	// 目标路径创建文件夹
	public void listFileInDir(File file) {
		File[] files = file.listFiles();
		for (File f : files) {
			String tempfrom = f.getAbsolutePath();    //源路径
			String tempto = tempfrom.replace(dirFrom.getAbsolutePath(),
					dirTo.getAbsolutePath()); // 把前面部分路径名替换为 目标路径名
			if (f.isDirectory()) {
				File tempFile = new File(tempto);
				tempFile.mkdirs();           //创建空文件夹
				listFileInDir(f);         //递归调用
			} else {
				System.out.println("源文件:" + tempfrom);
				System.out.println("目标点:" + tempto);
				copy(tempfrom, tempto);
			}
		}
	}
	/**
	 * 文件拷贝方法
	 */
	public void copy(String from, String to) {
		try {
			InputStream in = new FileInputStream(from);
			OutputStream out = new FileOutputStream(to);

			byte[] buff = new byte[1024];
			int len = 0;
			while ((len = in.read(buff)) != -1) {
				out.write(buff, 0, len);
			}
			in.close();
			out.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		File fromfile = new File("e:\\peixun\\test");// 源文件夹
		File tofile = new File("e:\\JavaZiliao\\peixun");// 目标

		CopyDir001 copy = new CopyDir001(fromfile,tofile);
		copy.listFileInDir(fromfile);

	}
}

 

import os import shutil from datetime import datetime, timedelta def get_recent_files(directory, days=30): """获取目录中最近N天修改过的文件""" cutoff = datetime.now() - timedelta(days=days) recent_files = {} for root, _, files in os.walk(directory): for file in files: file_path = os.path.join(root, file) try: mtime = datetime.fromtimestamp(os.path.getmtime(file_path)) if mtime >= cutoff: rel_path = os.path.relpath(file_path, directory) recent_files[rel_path] = file_path except OSError: continue return recent_files def copy_with_directory_structure(src, dst): """拷贝文件并保持目录结构""" os.makedirs(os.path.dirname(dst), exist_ok=True) shutil.copy2(src, dst) def compare_and_copy(a_dir, b_dir, c_dir, days=5): """主函数:只比较文件名差异并拷贝""" print("扫描近期修改文件...") a_files = get_recent_files(a_dir, days) b_files = get_recent_files(b_dir, days) os.makedirs(c_dir, exist_ok=True) diff_files = [] print("文件名差异对比...") for rel_path, a_path in a_files.items(): # 场景1:B中不存在该文件文件名差异) if rel_path not in b_files: dst_path = os.path.join(c_dir, rel_path) diff_files.append((a_path, dst_path)) print(f"开始拷贝 {len(diff_files)} 个差异文件...") for src, dst in diff_files: copy_with_directory_structure(src, dst) return len(diff_files) if __name__ == "__main__": # 路径配置(根据实际需要修改) # #1缸体 A_folder = r"\\192.168.190.241\csv" B_folder = r"\\192.168.10.119\sharecsv\ThreeD\#1\GT\output" C_folder = r"\\192.168.10.119\sharecsv\ThreeD\#1\GT" # #2缸体 D_folder = r"\\192.168.190.242\Report\CSV2" E_folder = r"\\192.168.10.119\sharecsv\ThreeD\#2\GT\output" F_folder = r"\\192.168.10.119\sharecsv\ThreeD\#2\GT" # #1缸盖 G_folder = r"\\192.168.190.189\csv" H_folder = r"\\192.168.10.119\sharecsv\ThreeD\#1\GG\output" I_folder = r"\\192.168.10.119\sharecsv\ThreeD\#1\GG" # #2缸盖 J_folder = r"\\192.168.190.116\csv2" K_folder = r"\\192.168.10.119\sharecsv\ThreeD\#2\GG\output" L_folder = r"\\192.168.10.119\sharecsv\ThreeD\#2\GG" # #1曲轴 M_folder = r"\\192.168.190.169\Bigdata" N_folder = r"\\192.168.10.119\sharecsv\ThreeD\#1\QZ\output" O_folder = r"\\192.168.10.119\sharecsv\ThreeD\#1\QZ" # #2曲轴 P_folder = r"\\192.168.190.170\tmc\Bigdata" Q_folder = r"\\192.168.10.119\sharecsv\ThreeD\#2\QZ\output" R_folder = r"\\192.168.10.119\sharecsv\ThreeD\#2\QZ" print("===== 开始#1缸体比较拷贝操作 =====") start_time = datetime.now() copied_count1 = compare_and_copy(A_folder, B_folder, C_folder) print(f"操作#1缸体完成! 共拷贝 {copied_count1} 个文件\n") print("===== 开始#2缸体比较拷贝操作 =====") copied_count2 = compare_and_copy(D_folder, E_folder, F_folder) print(f"操作#2缸体完成! 共拷贝 {copied_count2} 个文件") print("===== 开始#1缸盖比较拷贝操作 =====") copied_count3 = compare_and_copy(G_folder, H_folder, I_folder) print(f"操作#1缸盖完成! 共拷贝 {copied_count3} 个文件\n") print("===== 开始#2缸盖比较拷贝操作 =====") copied_count4 = compare_and_copy(J_folder, K_folder, L_folder) print(f"操作#2缸盖完成! 共拷贝 {copied_count4} 个文件") print("===== 开始#1曲轴比较拷贝操作 =====") copied_count5 = compare_and_copy(M_folder, N_folder, O_folder) print(f"操作#1曲轴完成! 共拷贝 {copied_count5} 个文件\n") print("===== 开始#2曲轴比较拷贝操作 =====") copied_count6 = compare_and_copy(P_folder, Q_folder, R_folder) print(f"操作#2曲轴完成! 共拷贝 {copied_count6} 个文件") elapsed = (datetime.now() - start_time).total_seconds() print(f"耗时 {elapsed6:.2f} 秒") 提升扫描文件夹文件效率,每个对比文件夹文件数量大于8万个
最新发布
10-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值