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();
			}
		}
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章