码迷,mamicode.com
首页 > 其他好文 > 详细

File类——复制指定文件夹

时间:2014-07-29 18:25:43      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:file类

输入需要复制的目标文件夹

输入需要复制到的目的文件夹

public class CopyDir {
	static Scanner in = new Scanner(System.in);
		static File dir=null;
	public static void main(String[] args) {
		System.out.println("请输入需要复制的目标文件夹的路径:");
		String need = in.nextLine();
		dir = new File(need);
//		dir = new File("F:\\0123");
		String fordir = dir.getPath();
		
		System.out.println("请输入复制到目的文件夹的路径:");
		String destDir = in.nextLine();
		File dest = new File(destDir);//把目的文件夹封装成文件对象 主要是判断该目的文件夹下是否 含有目标文件夹
		//目标文件夹  复制到该文件夹下
//		File dest = new File("F:");//\\MyServer
		
		//将目标文件夹的所有文件以及文件夹 复制到该文件夹下 该文件夹的名字肯能和目标文件夹同名
		destDir = dest.getPath()+"\\"+dir.getName();
		if(!dest.isDirectory()){
			System.out.println("请输入一个文件夹的路径");
			return;
		}
		//判断该目的文件夹下是否 含有目标文件夹
		else{
//			主要是想练习下 文件过滤  才写的以下代码    判断该目的文件夹下是否 含有目标文件夹
//			//如果dest为 文件而不是文件夹的话  listFiles方法会抛出NullPointerException异常
//			File[] files = dest.listFiles(new FilenameFilter(){
//				public boolean accept(File dir, String name) {
//					System.out.println(name);//dir就是dest 那么name就是dest下所有文件的名字包括文件夹和文件
//					return name.equals(CopyDir.this.dir.getName());
//				}});
//			System.out.println(files.length);
//			//长度等于1的时候说明复制到的目标文件夹下 有同名文件夹 也就是说 被复制的文件夹在复制到的文件夹内 此时 创建文件夹副本
//			if(files.length==1){
//				destDir = dest.getPath()+"\\"+dir.getName()+"-副本";
			
			//判断该目的文件夹下是否 含有目标文件夹   通过文件是否存在来判断
			File toDir = new File(destDir);
			if (toDir.exists()) {
				destDir = dest.getPath()+"\\"+dir.getName()+"-副本";
				toDir = new File(destDir);
			}
			int count = 0;
			while (toDir.exists()) {
				count++;
				if(!destDir.contains("-副本("+(count-1)+")"))
					destDir = dest.getPath()+"\\"+dir.getName()+"-副本(1)";
				else
					destDir = destDir.replace("-副本("+(count-1)+")", "-副本("+count+")");
				toDir = new File(destDir);
			}
			toDir.mkdir();
		}
		if (dir.isDirectory()){
			System.out.println("开始复制。。。");
			copyDir(dir,fordir,destDir);
		}
		else{
			System.out.println("您输入的不是文件夹!");
			return;
		}
			
		System.out.println("目标文件夹:"+dir.getName()+"->复制到目的文件夹:"+destDir+",,复制成功");
	}

	public static void copyDir(File dir,String fordir,String destDir) {
		File[] files = dir.listFiles();
		for (File file : files) {
			//注意  要先创建该文件夹对应的目的的新同名文件夹 然后递归
			if(file.isDirectory()){
				//将文件夹内的文件复制到另一个文件夹中 在复制文件前 需要先创建存放文件的文件夹
				File toDir = new File(file.getPath().replace(fordir, destDir));
				toDir.mkdir();
				//先创建 文件夹  再递归
				copyDir(file,fordir,destDir);
			}
			else{
				//复制的新文件
				File tofile = new File(file.getPath().replace(fordir, destDir));
				try {
					tofile.createNewFile();
					FileInputStream fis = new FileInputStream(file);
					FileOutputStream fos = new FileOutputStream(tofile);
					byte[] buf = new byte[1024];
					int len = 0;
					while ((len = fis.read(buf))!=-1) {
						fos.write(buf,0,len);
					}
					fis.close();
					fos.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}
}


/*
复制文件夹
从原文件夹中读取文件  赋值到文件夹副本中 实际上就是复制文件到 创建的文件夹副本中
1,从原文件夹中读取数据fs[i].isFile()  fs[i]是 文件的时候  直接复制
2,		fs[i]是文件夹的时候 首先 创建子文件夹副本 然后将原子文件夹内的文件复制到文件夹副本中
	子文件夹副本在上一级文件夹副本中  定义一个字符串存储 文件路径

*/
class copyDir
{
	String s = "null";//最外层 目录路径
	String path = "null";//定义一个字符串存储 文件路径
	public void readDir(File f,int lev) throws Exception//形参f代表的是 原文件夹
	{
		lev++;
		if(lev == 1)
		{	
			s = f.getName();
			System.out.println(s);
			path = f.getPath().replaceAll(s,s+"副本");
			System.out.println(path);
			File dir = new File(path);
			System.out.println(dir.mkdir());
		}	
		//原文件中的数据
		File[] fs = f.listFiles();
		for (int i=0 ;i<fs.length ;i++ )
		{
			if (fs[i].isFile())
			{
				path = fs[i].getParent().replaceAll(s,s+"副本");
				File fc = new File(path,fs[i].getName());
				//文件创建之前 一定要保证路径存(文件所在的文件夹)在 否则抛异常
				fc.createNewFile(); 
				//将文件 复制到新文件中
				BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fs[i]));
				BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fc));
				byte[] buf = new byte[1024];
				int len=0;
				while ((len=bis.read(buf,0,1024))!=-1)
				{
					bos.write(buf,0,len);
				}
				bos.close();
				bis.close();
			
			}		
			//是文件夹的话  创建文件夹副本
			if (fs[i].isDirectory())
			{
				path = fs[i].getPath().replaceAll(s,s+"副本");;
				File dir = new File(path);
				//创建文件夹
				dir.mkdir();
				readDir(fs[i],lev);
			}	
		}
	}
	public static void main(String[] args) throws Exception
	{
		File f = new File("F:\\0123");
		Long start = System.currentTimeMillis();
		new copyDir().readDir(f,0);
		Long over = System.currentTimeMillis();
		System.out.println("文件夹复制成功,耗时:"+(over-start));
		
	}
}


本文出自 “要么拼命,要么滚回去!” 博客,请务必保留此出处http://jiangzuun2014.blog.51cto.com/8732469/1532185

File类——复制指定文件夹,布布扣,bubuko.com

File类——复制指定文件夹

标签:file类

原文地址:http://jiangzuun2014.blog.51cto.com/8732469/1532185

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!