首先說說我的思路, 要複製一個目錄下的所有檔案到另外的一個目錄下,我們不知道目錄下的結構是怎麼樣的,也不知道目錄有多少層,檔案有多少個,這樣我們會想用迴圈,for! 但是我們不知道有多少層,所以迴圈不能夠滿足我們的需求。 學過遞迴的人,都知道這個用遞迴的思想可以很好解決這個問題的。
遞迴這裡我就不說是什麼東西了,這個自己可以百度,Google。
現在說說我的實現, 因為目錄下有可能存在目錄或者檔案,他們混在一起,所以我們很難進行操作和判斷,如果直接操作的話,我們要先建立目錄,才能定位檔案。這個操作起來比較複製。 所以我想到的是,先複製目錄的結構,再複製檔案這個思路。下面是My Code實現,
1.先寫一個檔案複製的操作方法
2.複製目錄結構的複製方法
3. 遞迴源目標檔案的方法
4. 整合 [java] view plain copy print ? import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class CopyDirectory { public static void main(String[] args) { //複製D盤下的bbs目錄到 D盤下的bb2/mms1下 CopyDirectory.copyFileOrDir("D://bbs", "D://bbs2//mms1"); } /** * @Description: 整合兩個操作,一個是檔案夾的所有目錄,然後複製目錄下的所有檔案到相應的目錄 * @param srcPath 需要複製的目錄 * @param targetPath 複製到哪裡 * @author L.Eric * create: 2013-4-16 */ public static void copyFileOrDir(String srcPath, String targetPath){ parseDir(srcPath,targetPath); copyAllFile(srcPath, targetPath); } public static void copyAllFile(String srcPath, String targetPath){ File f = new File(srcPath); File[] fileList = f.listFiles(); for(File f1 : fileList){ if(f1.isFile()) { CopyDirectory.copyFile(srcPath + "//" + f1.getName(), targetPath + "//" + f1.getName()); } //判斷是否是目錄 if(f1.isDirectory()) { copyAllFile(f1.getPath().toString(), targetPath + "//" + f1.getName()); } } } /** * @Description: 通過位元組流複製一個檔案 * @param src 源檔案的路徑 * @param target 目標檔案的路徑 * @author L.Eric * create: 2013-4-16 */ public static void copyFile(String src, String target){ InputStream is = null; OutputStream os = null; try { is = new FileInputStream(src); os = new FileOutputStream(target); byte[] buff = new byte[1024]; int len = 0; while((len = is.read(buff, 0, buff.length)) != -1) { os.write(buff, 0, len); } System.out.println("檔案拷貝成功。"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if(os!=null){ try { os.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if(is!=null){ try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } } /** * @Description: 複製一個目錄下的所有目錄檔案(只複製目錄結構) * @param pathName 需要複製的目標目錄 * @param target 產生的目標檔案目錄 * @author L.Eric * create: 2013-4-16 */ public static void parseDir(String pathName, String target){ //建立一個新的目錄 File targetFile = new File(target); if(!targetFile.exists()) { targetFile.mkdirs(); } //建立一個抽象路徑 File file = new File(pathName); if(file.isDirectory()){ File[] files = file.listFiles(); for(File f : files){ if(f.isDirectory()) { parseDir(f.getPath(), target + "//" + f.getName()); } } } } }