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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章