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

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

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;
	}
}

效果如下:

附读取规则文件内容

D:\快盘\[MobileBackup]	D:\\1360Downloads	.mp3	copy
D:\快盘\[MobileBackup]\[Pictures]\Pictures	D:\\1360Downloads	.png	copy
时间: 2024-10-09 12:16:37

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

文件夹搜索指定字符串软件

原文:文件夹搜索指定字符串软件 源代码下载地址:http://www.zuidaima.com/share/1554706879384576.htm 本程序主要功能是:找出指定文件夹中所有包含指定制字符串的文件.

文件处理工具 gif合成工具 文件后缀批量添加工具 文件夹搜索工具 重复文件查找工具 网页图片解析下载工具等

以下都是一些简单的免费分享的工具,技术支持群:592132877,提供定制化服务开发. Gif动图合成工具 主要功能是扫描指定的文件夹里的所有zip文件,然后提取Zip文件中的图片,并合成一张gif图片,存储到新的路径下,支持设置gif的时间,演示效果如下: 下载地址:gif合成工具 文件批量移动工具 主要功能是将指定文件夹及子文件夹里所有文件,复制到新的文件夹下,可以指定是否删除源文件.以下动图演示效果. 下载地址:文件批量移动工具.exe 文件批量移动工具 主要功能是将指定目录下所有文件按照

TortoiseSVN文件夹及文件图标不显示解决方法

由于自己的电脑是win7(64位)的,系统安装TortoiseSVN之后,其他的功能都能正常的使用,但是就是文件夹或文件夹的左下角就是不显示图标,这个问题前一段时间就遇到了(那个时候没找到合适的答案),这段时间重新学习svn 的使用,这个问题没解决,不舒服,没有了图标,就像打仗没有了旗帜一样: 对于SVN来说,因为每个图标都代表着不同的含义,预示着不同的状态,是指示灯的作用,如果没有正确的图标很可能造成数据的丢失等 今天算是找到了问题的解决方法: 第一: 输入:win+R,输入regedit,调

Powershell管理系列(二十一)PowerShell操作之不同文件夹内文件合并

-----提供AD\Exchange\Lync\Sharepoint\CRM\SC\O365等微软产品实施及外包,QQ:185426445.电话18666943750 需求:服务器使用几年下来,发现我们的磁盘下有多个类似的文件夹,我们想把这个文件夹合并到一个指定的文件夹,并删除其他不在使用的文件夹. 步骤1.我们打开我们的服务器, D盘下有5个各年信息资料汇总的文件夹, 里面有些文件是一样的,有些是不一样的.如下图: 步骤2.搜索出这5个文件夹的文件,并把往年的文件夹逐一和最新的"15年信息资料

如何把每个文件夹的文件单独提取出来放到另一个文件夹!

如何把每个文件夹的文件单独提取出来放到另一个文件夹!不要给我说用Ctrl+A或者是Ctrl+鼠标点!我那里可是有好多好多个文件夹的这些文件夹里的文件统一一次性直接都提取出来放到一个文件夹里?高手帮我下哇!!!  呵呵,这事我经常搞.方法是利用搜索功能,在这些文件夹的上一层文件进行搜索,搜索文件为*.*,也即所有文件,然后在搜索结果中选择所以文件(除去文件夹外的),然后复制粘贴到你要的文件夹里,就是你想要的结果. 继续追问: 我先试试哇·好了给你分呵呵

使用FileSystemWatcher监控文件夹及文件

引言 这一周主要精力集中学习一个同事开发的本地文件搜索项目上,其中客户端添加共享文件时主要是使用FileSystemWatcher 监控文件,并在各种事件发生时向服务器发送消息. 解决方法 FileSystemWatcher类以前也使用过,没有太仔细去观察,这次使用时才发现其事件提示会很有趣: a):当你添加文件或文件夹时,会触发Created事件,然后修改默认文件夹或文件名称再触发Changed事件. b):复制或移动文件夹文件时则是触发Created事件. c):删除文件夹或文件时触发Del

TortoiseSVN文件夹及文件图标不显示解决方法 [转]

由于自己的电脑是win7(64位)的,系统安装TortoiseSVN之后,其他的功能都能正常的使用,但是就是文件夹或文件夹的左下角就是不显示图 标,这个问题前一段时间就遇到了(那个时候没找到合适的答案),这段时间重新学习svn 的使用,这个问题没解决,不舒服,没有了图标,就像打仗没有了旗帜一样: 对于SVN来说,因为每个图标都代表着不同的含义,预示着不同的状态,是指示灯的作用,如果没有正确的图标很可能造成数据的丢失等 今天算是找到了问题的解决方法: 第一: 输入:win+R,输入regedit,

通过群晖 DSM 的 “装载远程文件夹(CIFS)” 功能来装载局域网中的 Win7 主机的指定文件或盘符

今天下午有空,就整理下电脑和 DSM 里的文件和资料,于是想把电脑里的几个盘 “映射” 到 DSM 的 File Station 中,以方便数据的搬移.这个 “映射” 就是通过 DSM 里 File Station 的 “装载远程文件夹” 来实现的,早在 DSM 版本还是 4.** 的时候就已经成功使用过,但不知道是因为没有把正确的操作回想起来还是 DSM 的操作变了,今天想用起来却一直不成功,上网各种搜索查询,费了一整个下午才搞成功.于是打算把这个设置过程记录下来,以仿今后为了相同的问题而重蹈

前端实现上传文件夹与文件夹名称的获取

最近再做一个标注类的项目,需求呢就是上传文件夹(内有n张图像),然后在系统中进行标注工作.前段时间已经把标注部分的交互写好了,原以为文件夹上传很好弄,结果费了半天的劲,网上有一些介绍,但是都不是太详细. 根据上搜索结果调研了一下,ie基本是实现不了文件夹的上传,因为是新装的系统,镜像里边没有ie,所以没法测试,按照网上的说法,ie中只有Edge这个浏览器版本可以实现,其他的主流浏览器我都测试了一下,windows环境下(谷歌.火狐.搜狗.360.QQ浏览器等主流浏览器都可以使用)只需要在<inp