输入需要复制的目标文件夹
输入需要复制到的目的文件夹
public class CopyDir { static Scanner in = new Scanner(System.in); static File dir=null; public static void main(String[] args) { System.out.println("请输入需要复制的目标文件夹的路径:"); String need = in.nextLine(); dir = new File(need); // dir = new File("F:\\0123"); String fordir = dir.getPath(); System.out.println("请输入复制到目的文件夹的路径:"); String destDir = in.nextLine(); File dest = new File(destDir);//把目的文件夹封装成文件对象 主要是判断该目的文件夹下是否 含有目标文件夹 //目标文件夹 复制到该文件夹下 // File dest = new File("F:");//\\MyServer //将目标文件夹的所有文件以及文件夹 复制到该文件夹下 该文件夹的名字肯能和目标文件夹同名 destDir = dest.getPath()+"\\"+dir.getName(); if(!dest.isDirectory()){ System.out.println("请输入一个文件夹的路径"); return; } //判断该目的文件夹下是否 含有目标文件夹 else{ // 主要是想练习下 文件过滤 才写的以下代码 判断该目的文件夹下是否 含有目标文件夹 // //如果dest为 文件而不是文件夹的话 listFiles方法会抛出NullPointerException异常 // File[] files = dest.listFiles(new FilenameFilter(){ // public boolean accept(File dir, String name) { // System.out.println(name);//dir就是dest 那么name就是dest下所有文件的名字包括文件夹和文件 // return name.equals(CopyDir.this.dir.getName()); // }}); // System.out.println(files.length); // //长度等于1的时候说明复制到的目标文件夹下 有同名文件夹 也就是说 被复制的文件夹在复制到的文件夹内 此时 创建文件夹副本 // if(files.length==1){ // destDir = dest.getPath()+"\\"+dir.getName()+"-副本"; //判断该目的文件夹下是否 含有目标文件夹 通过文件是否存在来判断 File toDir = new File(destDir); if (toDir.exists()) { destDir = dest.getPath()+"\\"+dir.getName()+"-副本"; toDir = new File(destDir); } int count = 0; while (toDir.exists()) { count++; if(!destDir.contains("-副本("+(count-1)+")")) destDir = dest.getPath()+"\\"+dir.getName()+"-副本(1)"; else destDir = destDir.replace("-副本("+(count-1)+")", "-副本("+count+")"); toDir = new File(destDir); } toDir.mkdir(); } if (dir.isDirectory()){ System.out.println("开始复制。。。"); copyDir(dir,fordir,destDir); } else{ System.out.println("您输入的不是文件夹!"); return; } System.out.println("目标文件夹:"+dir.getName()+"->复制到目的文件夹:"+destDir+",,复制成功"); } public static void copyDir(File dir,String fordir,String destDir) { File[] files = dir.listFiles(); for (File file : files) { //注意 要先创建该文件夹对应的目的的新同名文件夹 然后递归 if(file.isDirectory()){ //将文件夹内的文件复制到另一个文件夹中 在复制文件前 需要先创建存放文件的文件夹 File toDir = new File(file.getPath().replace(fordir, destDir)); toDir.mkdir(); //先创建 文件夹 再递归 copyDir(file,fordir,destDir); } else{ //复制的新文件 File tofile = new File(file.getPath().replace(fordir, destDir)); try { tofile.createNewFile(); FileInputStream fis = new FileInputStream(file); FileOutputStream fos = new FileOutputStream(tofile); byte[] buf = new byte[1024]; int len = 0; while ((len = fis.read(buf))!=-1) { fos.write(buf,0,len); } fis.close(); fos.close(); } catch (Exception e) { e.printStackTrace(); } } } } }
/* 复制文件夹 从原文件夹中读取文件 赋值到文件夹副本中 实际上就是复制文件到 创建的文件夹副本中 1,从原文件夹中读取数据fs[i].isFile() fs[i]是 文件的时候 直接复制 2, fs[i]是文件夹的时候 首先 创建子文件夹副本 然后将原子文件夹内的文件复制到文件夹副本中 子文件夹副本在上一级文件夹副本中 定义一个字符串存储 文件路径 */ class copyDir { String s = "null";//最外层 目录路径 String path = "null";//定义一个字符串存储 文件路径 public void readDir(File f,int lev) throws Exception//形参f代表的是 原文件夹 { lev++; if(lev == 1) { s = f.getName(); System.out.println(s); path = f.getPath().replaceAll(s,s+"副本"); System.out.println(path); File dir = new File(path); System.out.println(dir.mkdir()); } //原文件中的数据 File[] fs = f.listFiles(); for (int i=0 ;i<fs.length ;i++ ) { if (fs[i].isFile()) { path = fs[i].getParent().replaceAll(s,s+"副本"); File fc = new File(path,fs[i].getName()); //文件创建之前 一定要保证路径存(文件所在的文件夹)在 否则抛异常 fc.createNewFile(); //将文件 复制到新文件中 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fs[i])); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fc)); byte[] buf = new byte[1024]; int len=0; while ((len=bis.read(buf,0,1024))!=-1) { bos.write(buf,0,len); } bos.close(); bis.close(); } //是文件夹的话 创建文件夹副本 if (fs[i].isDirectory()) { path = fs[i].getPath().replaceAll(s,s+"副本");; File dir = new File(path); //创建文件夹 dir.mkdir(); readDir(fs[i],lev); } } } public static void main(String[] args) throws Exception { File f = new File("F:\\0123"); Long start = System.currentTimeMillis(); new copyDir().readDir(f,0); Long over = System.currentTimeMillis(); System.out.println("文件夹复制成功,耗时:"+(over-start)); } }
本文出自 “要么拼命,要么滚回去!” 博客,请务必保留此出处http://jiangzuun2014.blog.51cto.com/8732469/1532185
原文:http://jiangzuun2014.blog.51cto.com/8732469/1532185