Here you can find the source of recursiveCopyFile(File srcDir, File destDir)
public static File[] recursiveCopyFile(File srcDir, File destDir)
//package com.java2s; /*//w ww. ja va 2 s.c om This file is part of the BlueJ program. Copyright (C) 1999-2009,2014 Michael Kolling and John Rosenberg This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. This file is subject to the Classpath exception as provided in the LICENSE.txt file that accompanied this code. */ import java.io.*; import java.util.*; public class Main { /** * Recursively copy all files from one directory to another. * If destination is a sub directory of source directory then * it returns without copying any files. * * @return An array contained each source file which was * not successfully copied or null if everything went well */ public static File[] recursiveCopyFile(File srcDir, File destDir) { if (srcDir == null || destDir == null) throw new IllegalArgumentException(); File parentDir = destDir.getParentFile(); // check to make sure that the destination is not a subdirectory // of the source (which would lead to infinite recursion) while (parentDir != null) { if (parentDir.equals(srcDir)) return new File[] { srcDir }; parentDir = parentDir.getParentFile(); } return actualRecursiveCopyFile(srcDir, destDir); } private static File[] actualRecursiveCopyFile(File srcDir, File destDir) { // remember every file which we don't successfully copy List<File> failed = new ArrayList<File>(); // check whether source and dest are the same if (srcDir.getAbsolutePath().equals(destDir.getAbsolutePath())) return null; if (!srcDir.isDirectory() || !destDir.isDirectory()) throw new IllegalArgumentException(); // get all entities in the source directory File[] files = srcDir.listFiles(); if (files == null) { return null; } for (int i = 0; i < files.length; i++) { if (files[i] != null) { // handle directories by recursively copying if (files[i].isDirectory()) { File newDir = new File(destDir, files[i].getName()); newDir.mkdir(); if (newDir.isDirectory()) { actualRecursiveCopyFile(files[i], newDir); } else { failed.add(files[i]); } } else if (files[i].isFile()) { // handle all other files File newFile = new File(destDir, files[i].getName()); if (!newFile.exists()) { try { copyFile(files[i], newFile); } catch (IOException ioe) { failed.add(files[i]); } } else { failed.add(files[i]); } } } } if (failed.size() > 0) return (File[]) failed.toArray(new File[0]); else return null; } /** * Copy file 'source' to file 'dest'. The source file must exist, * the destination file will be created. Returns true if successful. */ public static void copyFile(String source, String dest) throws IOException { File srcFile = new File(source); File destFile = new File(dest); copyFile(srcFile, destFile); } /** * Copy file 'srcFile' to file 'destFile'. The source file must exist, * the destination file will be created. Returns true if successful. */ public static void copyFile(File srcFile, File destFile) throws IOException { // check whether source and dest are the same if (srcFile.equals(destFile)) { return; // don't bother - they are the same } InputStream in = null; OutputStream out = null; try { in = new BufferedInputStream(new FileInputStream(srcFile)); out = new BufferedOutputStream(new FileOutputStream(destFile)); copyStream(in, out); } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } /** * Copy stream 'in' to stream 'out'. */ public static void copyStream(InputStream in, OutputStream out) throws IOException { for (int c; (c = in.read()) != -1;) out.write(c); } }