Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to recursively copy entire directory including parent folder in Java

Tags:

java

directory

I am currently coping folders from one place to another. It is working fine out but it is not copying the original folder that all the rest of the files and folders are in over as well. This is the code I am using:

public static void copyFolder(File src, File dest) throws IOException {
  if (src.isDirectory()) {
    //if directory not exists, create it
    if (!dest.exists()) {
      dest.mkdir();
    }
    //list all the directory contents
    String files[] = src.list();
    for (String file : files) {
      //construct the src and dest file structure
      File srcFile = new File(src, file);
      File destFile = new File(dest+"\\"+src.getName(), file);
      //recursive copy
      copyFolder(srcFile,destFile);
    }
  } else {
    //if file, then copy it
    //Use bytes stream to support all file types
    InputStream in = new FileInputStream(src);
    OutputStream out = new FileOutputStream(dest); 
    byte[] buffer = new byte[1024];
    int length;
    //copy the file content in bytes 
    while ((length = in.read(buffer)) > 0){
      out.write(buffer, 0, length);
    }
    in.close();
    out.close();
    System.out.println("File copied from " + src + " to " + dest);
  }
}

So I have the folder src C:\test\mytest\..all folders..

I want to copy it to C:\test\myfiles

But instead of getting C:\test\myfiles\mytest\..all folders.. im getting C:\test\myfiles\..all folders..

like image 373
newSpringer Avatar asked Jul 25 '12 14:07

newSpringer


2 Answers

Try using the copyDirectory(File srcDir, File destDir) method from the Apache Commons IO library instead.

like image 71
Jean Logeart Avatar answered Oct 04 '22 06:10

Jean Logeart


There is a tutorial for copying files using java.nio with a recursive copy example code on Oracle Docs. It works with java se 7+. It uses Files.walkFileTree method, which might cause some issues on ntfs with junction points. To avoid using Files.walkFileTree, the possible solution can look like:

public static void copyFileOrFolder(File source, File dest, CopyOption...  options) throws IOException {
    if (source.isDirectory())
        copyFolder(source, dest, options);
    else {
        ensureParentFolder(dest);
        copyFile(source, dest, options);
    }
}

private static void copyFolder(File source, File dest, CopyOption... options) throws IOException {
    if (!dest.exists())
        dest.mkdirs();
    File[] contents = source.listFiles();
    if (contents != null) {
        for (File f : contents) {
            File newFile = new File(dest.getAbsolutePath() + File.separator + f.getName());
            if (f.isDirectory())
                copyFolder(f, newFile, options);
            else
                copyFile(f, newFile, options);
        }
    }
}

private static void copyFile(File source, File dest, CopyOption... options) throws IOException {
    Files.copy(source.toPath(), dest.toPath(), options);
}

private static void ensureParentFolder(File file) {
    File parent = file.getParentFile();
    if (parent != null && !parent.exists())
        parent.mkdirs();
} 
like image 27
jan.supol Avatar answered Oct 04 '22 05:10

jan.supol