首页 > 技术文章 > Java案例——复制单级\多级文件夹

CYan521 2022-04-11 17:22 原文

一、复制单级文件夹

需求:将"E:\Demo"文件夹复制到F盘下

分析:

1、创建数据源目录File,路径为"E:\Demo"

2、获取数据源目录File对象的名称也就是文件夹的名称

3、创建目的地目录File对象,路径名是要复制到的盘F:+将要复制到的文件名称(这里与原文件保持一致)

4、判断目的地目录对应的File是否存在,不存在就直接创建

5、获取数据源目录下的所有文件的File数组

6、遍历数组,得到每一个File对象,就是数据源文件

7、获取数据源文件File对象的名称

8、创建目的地文件File对象,路径名是目的地目录+名称

9、复制文件,由于文件类型不确定,采用字节流复制文件

/*
* 1、创建数据目录File,路径为"E:\\Demo"
2、获取数据源目录File对象的名称也就是文件夹的名称
3、创建目的地目录File对象,路径名是要复制到的盘F:+将要复制到的文件名称(这里与原文件保持一致)
4、判断目的地目录对应的File是否存在,不存在就直接创建
5、获取数据源目录下的所有文件的File数组
6、遍历数组,得到每一个File对象,就是数据源文件
7、获取数据源文件File对象的名称
8、创建目的地文件File对象,路径名是目的地目录+名称
9、复制文件,由于文件类型不确定,采用字节流复制文件
* */
public class Demo01 {
  public static void main(String[] args) throws IOException {
      //创建数据目录File,路径为"E:\\Demo"
      File srcFolder = new File("E:\\Demo");
      //获取数据源目录File对象的名称也就是文件夹的名称
      String srcFolderName = srcFolder.getName();
      //创建目的地目录File对象,路径名是要复制到的盘F:+将要复制到的文件名称(这里与原文件保持一致)
      File destFolder = new File("F:", srcFolderName);
      //判断目的地目录对应的File是否存在,不存在就直接创建
      if (!destFolder.exists()) {
          destFolder.mkdir();
      } else {
          System.out.println("文件名已存在,请修改目录名后再次运行");
      }
      //获取数据源目录下的所有文件的File数组
      File[] listfiles = srcFolder.listFiles();
      //遍历数组,得到每一个File对象,就是数据源文件
      for (File srcfile : listfiles) {
          //获取数据源文件File对象的名称
          String srcfileName = srcfile.getName();
          //创建目的地文件File对象,路径名是目的地目录+名称
          File destfile = new File(destFolder, srcfileName);
          //复制文件,由于文件类型不确定,采用字节流复制文件
          //调用方法
          copyFile(srcfile, destfile);

      }


  }

二、复制多级文件夹

需求:把"E:\Demo"复制到F盘下,Demo中含有多个文件夹,文件夹中又有多个子文件夹

分析:

1、创建数据源对象,路径是"E:\Demo"

2、创建目的地File对象,路径是F:\

3、写方法实现文件夹的复制,参数为数据源File对象和目的地File对象(用到递归)

4、判断数据源File是否是目录

是:

A:在目的地下创建和数据源File名称一样的目录

B:获取数据源File下所有的文件或者目录的File数组

C:遍历该File数组,得到每一个File对象

D:把该File作为数据源File对象,递归调用复制文件夹的方法

不是:

表明是文件,直接用字节流复制

package Demo041102;

import java.io.*;

/*
*1、创建数据源对象,路径是"E:\\Demo"
2、创建目的地File对象,路径是F:\\
3、写方法实现文件夹的复制,参数为数据源File对象和目的地File对象(用到递归)
4、判断数据源File是否是目录
是:
A:在目的地下创建和数据源File名称一样的目录
B:获取数据源File下所有的文件或者目录的File数组
C:遍历该File数组,得到每一个File对象
D:把该File作为数据源File对象,递归调用复制文件夹的方法
不是:
表明是文件,直接用字节流复制
* */
public class Demo02 {
  public static void main(String[] args) throws IOException {
      //创建数据源对象,路径是"E:\\Demo"
      File srcFile=new File("E:\\Demo");
      //创建目的地File对象,路径是F:\\
      File destFile=new File("F:\\");
      //写方法实现文件夹的复制,参数为数据源File对象和目的地File对象(用到递归)
      copyFolder(srcFile,destFile);

  }
  //复制文件夹
  private static void copyFolder(File srcFile, File destFile) throws IOException {
      //判断数据源File是否是目录
      if (srcFile.isDirectory()){
          //在目的地下创建和数据源File名称一样的目录
          String srcFileName = srcFile.getName();
          File newFolder=new File(destFile,srcFileName);
          if (!newFolder.exists()){
              newFolder.mkdir();
          }
          //获取数据源File下所有的文件或者目录的File数组
          File [] files= srcFile.listFiles();
          //遍历该File数组,得到每一个File对象
          for (File file:files){
              //把该File作为数据源File对象,递归调用复制文件夹的方法
              copyFolder(srcFile,newFolder);
          }

      }else{
          File newFile=new File(destFile,srcFile.getName());
          copyFile(srcFile,newFile);
      }
  }

  private static void copyFile(File srcfile, File destfile) throws IOException {
      //创建字节缓冲输入输出流
      BufferedInputStream bips = new BufferedInputStream(new FileInputStream(srcfile));
      BufferedOutputStream bops = new BufferedOutputStream(new FileOutputStream(destfile));
      //读取数据
      byte[] bytes = new byte[1024];
      int len;
      while ((len = bips.read(bytes)) != -1) {
          bops.write(bytes, 0, len);

      }
      bips.close();
      bops.close();
  }
}

 

推荐阅读