DFS遍历拷贝所有子文件夹及目录列表 (Java版)

如题
  • 注意,文件夹是不能拷贝的, 需要mkdir的
  • 文件选择合适的流进行拷贝
main测试方法
/**
	 * 主测试类,默认将D:\\base01 下的复制到D:\\base02
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		
		String originUrl;
		String targetUrl;
		
		System.out.println("请输入源目录: "+"D:\\base01");
//		originUrl = scanner.next();
		originUrl = "D:\\base01";
		System.out.println("请输入目标目录: "+"D:\\base02");
//		targetUrl = scanner.next();
		targetUrl = "D:\\base02";
		
		System.out.println("正在将"+originUrl+"目录下全部文件复制到"+targetUrl+".........");
		
		//Show Time , 先遍历,再逐个复制即可1
		File beginDir = new File(originUrl); 
		File endDir = new File(targetUrl); 
		
		//获取第一层目录, 遍历, 深度优先搜索
		File[] childFileArr = beginDir.listFiles();
		dfsDir(childFileArr,originUrl,targetUrl);
		
		System.out.println("复制成功--");
	}
dfs复制方法
/**
	 * dfs复制,文件夹mkdir后进入递归,文件直接拷贝
	 * @param childFileArr
	 * @throws IOException 
	 */
	public static void dfsDir(File[] childFileArr,String readerUrl,String writerUrl) throws IOException {
		//遍历
		for(File file : childFileArr) {
			//计算到拷贝的目标文件夹名称
			File targetDir = new File(writerUrl+"\\"+file.getName());
			
			//判断
			if(file.isDirectory()) {
				//是文件夹需要先mkdir targetDir
				 if(!targetDir.exists()){
					 targetDir.mkdirs();
				}
				//文件夹dfs搜下去即可
				 dfsDir(file.listFiles(),file.getAbsolutePath(),targetDir.getAbsolutePath());
			}
			else {
			//是文件进行复制
				copyFileReaderWriter(file.getAbsolutePath(),targetDir.getAbsolutePath());
			}
		}
	}
copyFileReaderWriter,文件的复制, 自行根据使用场景进行替换;比如音频不能用此字符流方法, 字符流多是用于文本复制

   /**
    * 根据Url进行文件的复制
    * @param readerUrl 字符流输入流
    * @param writerUrl 字符流输出流
    * @throws IOException
    */
   public static void copyFileReaderWriter(String readerUrl,String writerUrl) throws IOException {
   	Reader reader = new FileReader(readerUrl);
   	Writer writer = new FileWriter(writerUrl);
   	char[] arr = new char[5];
   	try {
   		int len=0;
   		while((len=reader.read(arr))!=-1) {
   			writer.write(new String(arr,0,len));
   		}
   	} catch (IOException e) {
   		// TODO Auto-generated catch block
   		e.printStackTrace();
   	}finally {
   		reader.close();
   		writer.close();
   	}
   }
测试输出
请输入源目录: D:\base01
请输入目标目录: D:\base02
正在将D:\base01目录下全部文件复制到D:\base02.........
复制成功--
测试结果

运行成功,所有子文件夹及目录均已拷贝成功.

posted @ 2019-06-19 17:19  山枫叶纷飞  阅读(385)  评论(0编辑  收藏  举报