輸入需要複製的目標文件夾
輸入需要複製到的目的文件夾
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)); } }