How to recursively copy entire directory including parent folder in Java

Viewed 22595

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..

9 Answers

This Solution is very simple but is NOT platform independent since the command is given to the operating system in plain text. (This example is for Unix based shells, for Windows the command will look a little different cp is called copy).

String source = "/user/.../testDir";
String destination = "/Library/.../testDestination/testDir";
String command = "cp -r " + source + " " + destination;
Process p;
try {
    p = Runtime.getRuntime().exec(command);
    p.waitFor();
} catch (InterruptedException | IOException e) {
    // Error handling
}

If you want the objects to be copied inside a subfolder with the same name, add it in the destination path, otherwise just omit it, then the folder content will be copied directly into the destination path.

Edit: just found out that unfortunately this solution does not work on Network drives. The reasons are unknown to me (but I admit I didn't dig for any reason)

Related