首页 > 技术文章 > 利用递归复制文件夹

wtyqer 2014-01-21 18:04 原文

思路:

1.定义两个静态字符串成员变量,分别关联源路径和目标路径

2.在main方法里判断源路径是否存在exists()

3.在main方法里判断目标路径是否存在exists()  

  如果存在删除已存在的路径,否则直接创建路径

4.遍历获取源路径下的文件和目录  

  如果是文件执行复制文件方法copyFile()  复制文件方法采用缓冲的字节流+字节数组实现  

  否则定义两个字符串变量  

    关联:源路径+遍历到目录的名字   

        目标路径+遍历到目录的名字  

        将两个变量再作为源目录和目标目录传入复制文件夹方法copyDirectiory()

5.复制文件夹方法会用到递归  

  首先还是新建目标目录  

  然后再获取源目录下的文件和文件夹  

  判断该目录下是文件还是文件夹

    前者就调用copyFile()  

    如果是后者,则再定义两个字符串变量调用本方法递归

  1 import java.io.File;
  2 import java.io.FileInputStream;
  3 import java.io.FileOutputStream;
  4 import java.io.BufferedInputStream;
  5 import java.io.BufferedOutputStream;
  6 import java.io.IOException;
  7 
  8 public class TestCopy2 {
  9  /**
 10   *Java中实现拷贝文件夹
 11   *拷贝一个文件的算法比较简单,当然,可以对它进行优化,比如使用缓冲,提高读写数据的效率等。
 12   *但是在拷贝文件夹时,则需要利用Flie类在目标文件夹中创建相应的目录,并且使用递归方法。
 13   * 
 14   *用到的方法列表如下
 15   *public boolean exists()测试此抽象路径名表示的文件或目录是否存在。 
 16   *public boolean delete()删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除。 
 17   *public boolean mkdirs()创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。 
 18   *public File[] listFiles()返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 
 19   *public static final String separator与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
 20   *public String getName()返回由此抽象路径名表示的文件或目录的名称。该名称是路径名名称序列中的最后一个名称。
 21   *  
 22   *注意:复制文件的方法和复制目录的方法中传入的内容是不同的,前者是以文件传入的,后者是以字符串传入的
 23   * */
 24 
 25  // 源路径名 
 26  static String url1 = "f:/photos"; 
 27  // 目标路径名 
 28  static String url2 = "g:/tempPhotos"; 
 29  public static void main(String args[]) throws IOException { 
 30 
 31      // 判断源路径是否存在
 32     if (!(new File(url1)).exists()) {
 33      System.out.println("源文件:" + url1 + "不存在!");
 34      System.exit(0);
 35     }  
 36     
 37     // 判断目标路径是否存在
 38     if ((new File(url2)).exists()) {
 39      // 删除已经存在的目标路径,无论目标是目录还是单个文件
 40      (new File(url2)).delete(); 
 41     } else {
 42            //如果目标路径不存在,则创建路径
 43           boolean i=(new File(url2)).mkdirs();
 44           if (i==false) {
 45           System.out.println("复制文件失败:创建目标文件所在目录失败"); 
 46           System.exit(0);
 47       }
 48     } 
 49       // 获取源文件夹当前下的文件或目录   
 50      File[] file = (new File(url1)).listFiles(); 
 51      for (int i = 0; i < file.length; i++) { 
 52          if (file[i].isFile()) { 
 53              // 复制文件 
 54              copyFile(file[i],new File(url2+File.separator+file[i].getName())); 
 55          }else 
 56              if (file[i].isDirectory()) { 
 57                // 复制目录 
 58                String sourceDir=url1+File.separator+file[i].getName(); 
 59                String targetDir=url2+File.separator+file[i].getName(); 
 60                copyDirectiory(sourceDir, targetDir); 
 61              } 
 62      } 
 63  } 
 64 
 65  //复制文件 
 66  public static void copyFile(File sourceFile,File targetFile)throws IOException{  
 67         // 新建文件输入流并对它进行缓冲   
 68         FileInputStream input = new FileInputStream(sourceFile);  
 69         BufferedInputStream inBuff=new BufferedInputStream(input);  
 70   
 71         // 新建文件输出流并对它进行缓冲   
 72         FileOutputStream output = new FileOutputStream(targetFile);  
 73         BufferedOutputStream outBuff=new BufferedOutputStream(output);  
 74           
 75         // 缓冲数组   
 76         byte[] b = new byte[1024 * 5];  
 77         int len;  
 78         while ((len =inBuff.read(b)) != -1) {  
 79             outBuff.write(b, 0, len);  
 80         }  
 81         // 刷新此缓冲的输出流   
 82         outBuff.flush();  
 83           
 84         //关闭流   
 85         inBuff.close();  
 86         outBuff.close();  
 87         output.close();  
 88         input.close();  
 89     }  
 90 
 91  // 复制文件夹 
 92   /**
 93      * 下面方法用到递归方法,
 94      * 首先创建该目录
 95      * 判断该目录下是文件还是目录,如果是文件,则调用函数copyFile(File sourceFile,File targetFile)进行复制
 96      * 如果是目录,则调用copyDirectiory(dir1, dir2),程序再次回到copyDirectiory()
 97      * 创建子目录,然后进行判断。
 98      * 如果是空目录,那么(new File(sourceDir)).listFiles()获得的是0,不进行for循环,退出该函数
 99      * 
100      * */
101  public static void copyDirectiory(String sourceDir, String targetDir)throws IOException {
102      // 新建目标目录 
103      (new File(targetDir)).mkdirs(); 
104      // 获取源文件夹当前下的文件或目录 
105      File[] file = (new File(sourceDir)).listFiles(); 
106      for (int i = 0; i < file.length; i++) { 
107          if (file[i].isFile()) { 
108              // 源文件 
109             File sourceFile=file[i]; 
110              // 目标文件 
111             File targetFile=
112                 new File((new File(targetDir)).getAbsolutePath()+File.separator+file[i].getName());
113             copyFile(sourceFile,targetFile); 
114          } else
115              if (file[i].isDirectory()) { 
116                 // 准备复制的源文件夹 
117                 String dir1=sourceDir + File.separator + file[i].getName(); 
118                 // 准备复制的目标文件夹 
119                 String dir2=targetDir + File.separator+ file[i].getName();          
120                 copyDirectiory(dir1, dir2); 
121              } 
122      } 
123  } 
124 }

 

 

 

 

 

推荐阅读