Search code examples
javaiodirectorynio

Moving files from one directory to another with Java NIO


I am using the NIO libraries but I am getting a strange error when I try to move files from one directory to another.

String yearNow = new SimpleDateFormat("yyyy").format(
    Calendar.getInstance().getTime());

try {
     DirectoryStream<Path> curYearStream = 
       Files.newDirectoryStream(sourceDir, "{" + yearNow + "*}"); 
       //Glob for current year

     Path newDir = Paths.get(sourceDir + "//" + yearNow);

     if (!Files.exists(newDir) || !Files.isDirectory(newDir)) {
         Files.createDirectory(newDir); 
         //create 2014 directory if it doesn't exist
     }
}

Iterate over elements that start with "2014" and move them in the new directory (newDir, which is also called 2014)

for (Path p : curYearStream) {
    System.out.println(p); //it prints out exactly the files that I need to move
    Files.move(p, newDir); //java.nio.file.FileAlreadyExistsException
}

I get the java.nio.file.FileAlreadyExistsException because my folder (2014) already exists. What I actually want to do is move all the files that start with "2014" INSIDE the 2014 directory.


Solution

  • Files.move is not equivalent to the mv command. It won't detect that the destination is a directory and move files into there.

    You have to construct the full destination path, file by file. If you want to copy /src/a.txt to /dest/2014/, the destination path needs to be /dest/2014/a.txt.

    You may want to do something like this:

    File srcFile = new File("/src/a.txt");
    File destDir = new File("/dest/2014");
    Path src = srcFile.toPath();
    Path dest = new File(destDir, srcFile.getName()).toPath(); // "/dest/2014/a.txt"