IO流實現文件夾拷貝

IO流實現文件夾拷貝

分爲3個步驟進行實現:

​ 一、判斷

​ 二、複製文件夾

​ 三、複製文件

				==================================判斷地址是否條件需求==================================
    /*條件:
    	1:倆個地址文件夾是否存在
    	2:目的地不能是相同目錄下(相同目錄一下不能存在相同名字的文件夾)
    	3:目的地不能是 拷貝文件的子目錄
    */
	public static void panDuan(String a, String b) {//重寫方法,當傳入的地址是字符串時轉爲flie對象調用相應的方法
		panDuan(new File(a),new File(b));
	}
	public static void panDuan(File a, File b) {
		String s = a.getAbsolutePath().toString();// a(數據源)絕對地址轉爲字符串
		String s2 = b.getAbsolutePath().toString();// b(目的地)絕對地址轉爲字符串
		String s1 = s.substring(0, s.lastIndexOf("\\"));// 取數據源最後一個 \ 之前的字符串
		
		if (a.isDirectory() && b.isDirectory()) {//判斷給的倆個路徑是否正確
			if (!(s2.equals(s1) || s2.equals((s1 + "\\")))) {// 判斷文件拷貝的地址是不是當前文件所在路徑下
				System.out.println("驗證1通過");
				if (!s2.contains(s)) { // 判斷s2 是否有s這個字符串(用來判斷是否複製到了文件的子文件下)
					System.out.println("驗證2通過");
					System.out.println("開始拷貝...");//滿足以上要求再調用文件拷貝方法
					cd02(a, b);
				} else {
					System.out.println("警告!不能拷貝到當前文件夾子目錄下!!");
				}
			} else {
				System.out.println("警告!不能拷貝到當前文件夾路徑下!!");
			}
		}else System.out.println("警告!路徑非法!!");
	}

				====================================複製文件夾=======================================
    
	public static void cd02(File f1, File f2) {
		File[] f11 = f1.listFiles();//創建f1路徑下文件名的數組
		File f4 = new File(f2.getAbsolutePath() + "/" + f1.getName());// 拼接目的地文件名
		if (!f4.exists()) { // 判斷目的地是否有該文件 沒有就創建
			f4.mkdir();
		}
		// System.out.println(f4);//可以打印判斷下是否拼接正確
		int a = 0, b = 0;
		for (File j : f11) {//使用增強for遍歷 
			if (j.isDirectory()) { //isDirectory()判斷是否爲文件夾
				cd02(new File(f1 + "\\" + j.getName()), f4);// 遍歷目標源目錄中有文件夾則用該文件夾地址重新調用cd02方法,實現遞歸
				a++;
			}
			if (j.isFile()) {// isFlie()判斷是文件類型則調用文件拷貝
				Copy(j,f4);// 調用Copy方法拷貝文件
			}
		}
		b++;
		if (a == b) {//當a和b相等的時候說明所有文件夾中已經全部拷貝完畢
			System.out.println("拷貝完成!!!!");
		}
	}

				====================================複製文件============================================
    
	public static void Copy(File f, File f1) {
		InputStream s = null;//多態定義讀取空對象,提高寫入效率
		OutputStream out = null;//多態定義輸出空對象,提高寫入效率

		try {
			s = new FileInputStream(f);//把傳入的file目標地址賦值給讀取對象
			File file = new File(f1.getPath() + File.separator + f.getName());//拼接 目的地 的該文件地址+文件名
			out = new FileOutputStream(file);//把地址+文件名 賦值給 字節 輸出對象   有文件則直接複製內容,沒有文件則會自動創建文件夾並複製
			int a = -1;
			try {  //while循環實現文件的拷貝
				while ((a = s.read()) != -1) {//read() 讀取,讀取不到時會返回-1
					out.write(a);   //write() 輸出
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			try {
				out.flush();//輸出字節時有可能有殘留,清理io流通道殘留的字節
				out.close();//關閉輸出資源
				s.close();//關閉寫入資源    注意! 後開先關
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章