文件夹搜索文件并从将其复制或移动到指定目录

写一个小工具,需求是从一个文件夹中搜索指定关键字的文件,并将搜索结果复制或者移动到新的目录下,需要保持原目录结构,并且关键字可灵活指定,并且可以指定是复制还是移动

import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Scanner;

public class TextCopyUtil {
	static int countFiles = 0;// 声明统计文件个数的变量
	static int countFolders = 0;// 声明统计文件夹的变量

	static String srcFolderPath = "D:\\\\快盘";// 默认目录
	static String destFolderPath = "D:\\\\1360Downloads";// 目标目录
	static String keyword = "会议纪要.txt";
	static String type = "copy";
	
	public static void main(String[] args) {// java程序的主入口处
		System.out.println("现在开始操作批量处理文件");
		System.out.println("你要处理的文件为:"+args[0]);
		List<String> result = txt2StringList(new File(args[0]));
		
		System.out.print("\t默认目录");
		System.out.print("\t目标目录");
		System.out.print("\t关键字");
		System.out.println("\t处理方式(move表示移动,copy表示复制)");
		
		for (String string : result) {
			String[] arr = string.split("\t");
			String srcFolderPath = arr[0];// 默认目录
			String destFolderPath = arr[1];// 目标目录
			String keyword = arr[2];
			String type = arr[3];
			
			System.out.print("\t"+srcFolderPath);
			System.out.print("\t"+destFolderPath);
			System.out.print("\t"+keyword);
			System.out.println("\t"+type);
			
			Scanner input = new Scanner(System.in);
			System.out.println("如果和预期一致请输入数字1,否则其他数字");
				String name = input.nextLine();
				if("1".equals(name)){
					System.out.println(Calendar.getInstance().getTimeInMillis());
					run(srcFolderPath, destFolderPath, keyword, type);
					System.out.println(Calendar.getInstance().getTimeInMillis());
				}
			}
		}
	
	public static List<String> txt2StringList(File file) {
		List<String> result = new ArrayList<String>();
		try {
			BufferedReader br = new BufferedReader(new FileReader(file));// 构造一个BufferedReader类来读取文件
			String s = null;
			while ((s = br.readLine()) != null) {// 使用readLine方法,一次读一行
				result.add(s);
			}
			br.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 执行搜索并复制
	 * @param srcFolderPath 搜索目录
	 * @param destFolderPath 复制目标目录
	 * @param keyword 关键字
	 */
	public static void run(String srcFolderPath, String destFolderPath,
			String keyword,String type) {
		File srcFolder = new File(srcFolderPath);// 默认目录
		File destFolder = new File(destFolderPath);// 目标目录
		if (!srcFolder.exists()) {// 如果文件夹不存在
			System.out.println("目录不存在:" + srcFolder.getAbsolutePath());
			return;
		}
		if (!destFolder.exists()) {// 如果文件夹不存在
			mkDir(destFolder);
			System.out.println("目录创建成功:" + destFolder.getAbsolutePath());
		}
		File[] result = searchFile(srcFolder, keyword);// 调用方法获得文件数组
		System.out.println("在 " + srcFolder + " 以及所有子文件时查找对象" + keyword);
		System.out.println("查找了" + countFiles + " 个文件," + countFolders
				+ " 个文件夹,共找到 " + result.length + " 个符合条件的文件:");
		System.out.println("开始复制以上所有查找到的对象");
		for (int i = 0; i < result.length; i++) {// 循环显示文件
			File file = result[i];
			File destFile = new File(file.getAbsolutePath().replaceFirst(srcFolderPath, destFolderPath));
			if(type!=null&&"move".equals(type)){
				//移动
				file.renameTo(destFile);
			}else{
				//复制
				fileChannelCopy(file, destFile);
			}
			System.out.println(file.getAbsolutePath() + " 复制到 "
					+ destFile.getAbsolutePath());// 显示文件绝对路径
		}
	}

	/**
	 * 创建文件夹
	 * 
	 * @param file
	 */
	public static void mkDir(File file) {
		if (file.getParentFile().exists()) {
			if (!file.exists()) {
				file.mkdir();
			}
		} else {
			mkDir(file.getParentFile());
			file.mkdir();
		}
	}

	/**
	 * 使用文件通道的方式复制文件
	 * 
	 * @param s
	 *            源文件
	 * @param t
	 *            复制到的新文件
	 */
	public static void fileChannelCopy(File s, File t) {
		mkDir(t.getParentFile());
		FileInputStream fi = null;
		FileOutputStream fo = null;
		FileChannel in = null;
		FileChannel out = null;
		try {
			fi = new FileInputStream(s);
			fo = new FileOutputStream(t);
			in = fi.getChannel();// 得到对应的文件通道
			out = fo.getChannel();// 得到对应的文件通道
			in.transferTo(0, in.size(), out);// 连接两个通道,并且从in通道读取,然后写入out通道
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				fi.close();
				in.close();
				fo.close();
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 递归查找包含关键字的文件
	 * 
	 * @param folder
	 * @param keyWord
	 * @return
	 */
	public static File[] searchFile(File folder, final String keyWord) {
		File[] subFolders = folder.listFiles(new FileFilter() {// 运用内部匿名类获得文件
					public boolean accept(File pathname) {// 实现FileFilter类的accept方法
						if (pathname.isFile())// 如果是文件
							countFiles++;
						else
							// 如果是目录
							countFolders++;
						if (pathname.isDirectory()
								|| (pathname.isFile() && pathname.getName()
										.toLowerCase()
										.contains(keyWord.toLowerCase())))// 目录或文件包含关键字
							return true;
						return false;
					}
				});

		List result = new ArrayList();// 声明一个集合
		if (subFolders != null) {
			for (File subFolder : subFolders) {// 循环显示文件夹或文件
				if (subFolder.isFile()) {// 如果是文件则将文件添加到结果列表中
					result.add(subFolder);
				} else {// 如果是文件夹,则递归调用本方法,然后把所有的文件加到结果列表中
					File[] foldResult = searchFile(subFolder, keyWord);
					if (foldResult != null) {
						for (File fold : foldResult) {// 循环显示文件
							result.add(fold);// 文件保存到集合中
						}
					}
				}
			}
		}

		File files[] = new File[result.size()];// 声明文件数组,长度为集合的长度
		result.toArray(files);// 集合数组化
		return files;
	}
}

效果如下:

112512_V8MM_110328.jpg

附读取规则文件内容

D:\快盘\[MobileBackup]	D:\\1360Downloads	.mp3	copy
D:\快盘\[MobileBackup]\[Pictures]\Pictures	D:\\1360Downloads	.png	copy


转载于:https://my.oschina.net/liuyuxiang/blog/498555

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很有用的东西,特别对于手非常有用,网上找不到的,西面是源码,看不懂的你只有下载了! .版本 2 .支持库 EThread 清除数组 (目录数组) 清除数组 (文件数组) 按钮3.禁止 = 真 启动线程 (&线程_进度显示, , 线程句柄) .子程序 线程_进度显示 .局部变量 计次, 整数型 .局部变量 dir, 文本型 .局部变量 计次一, 整数型 .局部变量 path, 文本型 .局部变量 swit, 逻辑型 .局部变量 num, 整数型 原路径 = 取当前目录 () + “\3” 目标路径 = “c:\3” 子程序_核心搜索 (取当前目录 () + “\3”) 进度条1.位置 = 0 进度条1.最大位置 = 取数组成员数 (目录数组) .计次循环首 (取数组成员数 (目录数组), 计次) dir = 子文本替换 (目录数组 [计次], 原路径, 目标路径, , 1, 真) 创建目录 (dir) 进度条1.位置 = 进度条1.位置 + 1 .计次循环尾 () 标签3.标题 = “更中...” 进度条1.位置 = 0 进度条1.最大位置 = 取数组成员数 (文件数组) .计次循环首 (取数组成员数 (文件数组), 计次一) path = 子文本替换 (文件数组 [计次一], 原路径, 目标路径, , 1, 真) swit = CopyFileExA (文件数组 [计次一], path, &CopyProgressRoutine;, 0, 0, #COPY_FILE_RESTARTABLE) .如果真 (swit = 假) num = num + 1 .如果真结束 进度条1.位置 = 进度条1.位置 + 1 .计次循环尾 () 标签3.标题 = “报告老大已经全部更... 失败:” + 到文本 (num) + “个” 按钮3.禁止 = 假 .子程序 CopyProgressRoutine, 整数型 .参数 TotalFileSize, 双精度小数型 .参数 TotalBytesTransferred, 双精度小数型 .参数 StreamSize, 双精度小数型 .参数 StreamBytesTransferred, 双精度小数型 .参数 dwStreamNumber .参数 dwCallbackReason .参数 hSourceFile .参数 hDestinationFile .参数 lpData 进度条2.位置 = 取整 (TotalBytesTransferred × 10000 ÷ (TotalFileSize × 10000) × 100) 返回 (#PROGRESS_CONTINUE) .子程序 子程序_核心搜索 .参数 目标目录, 文本型 .局部变量 文件名, 文本型 文件名 = 寻找文件 (目标目录 + “\*.*”, #子目录) .判断循环首 (文件名 ≠ “”) .如果真 (文件名 ≠ “.” 且 文件名 ≠ “..”) 加入成员 (目录数组, 目标目录 + “\” + 文件名) 子程序_核心搜索 (目标目录 + “\” + 文件名) .如果真结束 文件名 = 寻找文件 (, #子目录) .判断循环尾 () 文件名 = 寻找文件 (目标目录 + “\*.*”, ) .判断循环首 (文件名 ≠ “”) 加入成员 (文件数组, 目标目录 + “\” + 文件名) 文件名 = 寻找文件 (, ) .判断循环尾 () .子程序 __启动窗口_可否被关闭, 逻辑型 .如果真 (按钮3.禁止) .如果真 (信息框 (“正在复制文件中,是否强制关闭?”, 4 + 48, ) = 6) 返回 (假) .如果真结束 强制结束线程 (线程句柄)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值