文件夹复制(拷贝)原理分析

在学习文件拷贝后,进入深一层次的训练,首先我们简单分析,把一个文件夹复制到另一个目录下,目的路径不一定存在,不存在就得创建文件夹,使用mkdirs(),在进入目录第二层目录要获取所有目录和文件再进行拷贝,然后一直递归。

       

先看看仅复制文件夹的代码:

import java.io.File;

/**
 * 复制文件夹
 * @author Administrator
 *
 */
public class Practice02 {
	public static void main(String[] args){
		String path = "E:/01";
		String path2 = "E:/02";
		File src = new File(path);
		File des = new File(path2);
		des = new File(des,src.getName());
		test1(src,des);
	
	}
	public static void test1(File src,File des){
		if(src.isDirectory()){
		
			des.mkdirs();//确保目的路径存在
	
			File[] files = src.listFiles();
			for(File file:files){
				//得调用自身 也就是递归
				test1(file,new File(des,file.getName()));
			}
		}
	}
	
}



  在获取到两个路径后: "E:/01" "E:/02"   源路径必须存在,这时目的路径实例要复制源文件夹名,因为在后面的方法里第一次读取listFile时,File[]没有01文件夹名,也就是第一次要获取文件夹的名字,而且是否为文件夹也得判断isDirectory(),在判定为文件夹后,我们为了确定目的路径一定存在,所有使用mkdirs(),这时源路径与目的路径已经存在,可以进行后面的拷贝工作了;遍历源路径下的文件夹listFile(),得到路径下的每个文件名,包括文件夹的名称,这些子目录下也可能存在目录,所有要进行的操作相同,递归调用自己,此时为目录的第二层,这时的src变为"E:/01/22" 也就是file,而des变为"E:/02/01/22",这样一直重复直完。
     同理在拷贝文件夹路径下的所有文件时,要多加一些复制文件的代码,到第二层目录,在listFiles里,有多个目录或文件,依次进行和第一层一样的过程,这个过程多出一个判断是否为文件,是则复制文件,若为目录,再调用自身,再进入第三层目录,如此循环直到最里面的目录,见下面代码:
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;

/**
 * 复制文件夹
 * 用到了mkdirs
 * 
 * @author Administrator
 *
 */
public class test04 {
	public static void main(String[] args){
		
		String path = "E:/01";
		String path2 = "E:/03";
		File src = new File(path);
		File des = new File(path2);
		des = new File(des,src.getName());
		copy(src,des);
		try {
			copyfolder(src,des);
		} catch (FileNotFoundException e) {
			
			e.printStackTrace();
		}
		
	}
	public static void copy(File src,File des){
		if(src.isDirectory()){
			 des = new File(src,src.getName());
		}
	}
	/**
	 * 拷贝文件
	 * @param src
	 * @throws FileNotFoundException 
	 */
	public static  void copyfolder(File src,File des) throws FileNotFoundException{
		//获得路径,判读是否是文件
		if(src.isDirectory()){
			//位确保目标文件夹存在	
			//des = new File(des,src.getName());
			des.mkdirs();
			File[] fileList = src.listFiles();
			for(File fileName:fileList){
				
				copyfolder(fileName,new File(des,fileName.getName()));//
			}
			
		}else if(src.isFile()){
			
			copyFile(src,des);
		}
		
	}

	public static void copyFile(File src,File des) throws FileNotFoundException{
		//判断为文件,进行文件拷贝
		if(src.isFile()){
			
			InputStream in = new FileInputStream(src);
			OutputStream ou = new FileOutputStream(des);
			
			byte[] data = new byte[1024];
			int len = 0;
			try {
				while(-1!=(len = in.read(data))){
					ou.write(data, 0, len);
					ou.flush();
				}
			} catch (IOException e) {
			
				e.printStackTrace();
			}finally{
				
				try {
					ou.close();
				} catch (IOException e) {
					
					e.printStackTrace();
				}
			}
			
		}
		
		
	}
}




你可能感兴趣的:(IO学习,递归,IO流,File类,文件夹复制)