package com.itheima.day17;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
public class Test02_CopyDir {
public static void main(String[] args) throws IOException {
/*
* 需求:复制文件夹
* 思路:
* 1、定义一个方法,用来获取用户录入的文件夹路径。 getDir();
* 2、定义一个方法,用来复制文件夹。 copyDirectory(File src,File dest);
*/
File src = getDir(); //获取数据源文件夹路径
File dest = getDir(); //获取目的地文件夹路径
if (src.equals(dest)) {
System.out.println("目标文件夹是源文件夹的子文件夹");
}else {
copyDirectory(src, dest);
System.out.println("搞定");
}
}
//1、定义一个方法,用来获取用户录入的文件夹路径。 getDir();
public static File getDir(){
/*
* 思路:
* 1、提示用户键盘录入一个文件夹路径。
* 2、接收用户录入的内容,然后封装成File对象,然后判断是否是文件夹。
* 是:直接返回
* 否:提示用户重新录入。
* 3、因为不知道用户多少次能录入争取,所以用while(true)改进。
*/
System.out.println("请输入一个文件夹路径"); //1
while(true){ //3
File file = new File(new Scanner(System.in).nextLine()); //2
if(!file.isDirectory()){ //然后判断是否是文件夹
//进来说明用户录入的不是文件夹
System.out.println("录入有误,请重新录入");
}else { //说明是文件夹,直接返回。
return file;
}
}
}
//2、定义一个方法,用来复制文件夹。 copyDirectory(File src,File dest); src是数据源文件夹 dest是目的地文件夹
public static void copyDirectory(File src,File dest) throws IOException{
/*
* 思路:
* 1、在目的地文件夹下创建一个和 数据源文件夹一样名字的文件夹。
* 注意先做判断,看文件夹是否存在。
* 2、获取到数据源文件夹下所有的文件(夹) 的 File[].
* 3、遍历第二步获取到的File[],获取到么一个File对象,然后判断
* 是文件: 直接拷贝。
* 是文件夹:就递归调用。
*/
File newDir = new File(dest,src.getName()); //1 newDir = "D:\test\dest\src";
if (!newDir.exists()) {
newDir.mkdir();
}
File[] subFiles = src.listFiles(); //2
for (File subFile : subFiles) { //3
if (subFile.isFile()) { //是文件就直接拷贝
//复制文件: 把subFile复制到:newDir文件夹中,注意保持文件夹一致 //难点,分析清楚 目的地文件夹是谁,以及保持文件夹名一致
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(subFile)); //封装数据源
File file = new File(newDir,subFile.getName()); //获取目的地文件路径
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); //封装目的地
int ch = 0;
while((ch=bis.read())!=-1){
bos.write(ch);
}
bis.close();
bos.close();
}else { //是文件夹,就递归调用
copyDirectory(subFile,newDir); //难点,分析清楚那个文件夹和哪个文件夹递归
}
}
}
}
|
|