5

Can anyone tell me what I've done wrong with the following code. I receive no errors - it just goes straight to the catch.

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {

    public static void main(String[] args) {
         Path source = Paths.get("C:\\Users\\Public\\Pictures\\SamplePictures");
    Path nwdir = Paths.get("D:\\NetbeansProjects\\CopyingFiles\\copiedImages");

    try{
    Files.copy(source, nwdir);
    }catch (IOException e){
        System.out.println("Unsucessful. What a surprise!");
    }
    }
}
user1311422
  • 85
  • 2
  • 2
  • 7

3 Answers3

7

If you take a look at the Javadocs of Files.copy, you'll notice this line (emphasis added):

If the file is a directory then it creates an empty directory in the target location (entries in the directory are not copied). This method can be used with the walkFileTree method to copy a directory and all entries in the directory, or an entire file-tree where required.

So it looks like you need to use that walkFileTree method.

(And as the commenters said, print out exceptions and they'll often tell you what's wrong!)

joews
  • 29,767
  • 10
  • 79
  • 91
Jon7
  • 7,165
  • 2
  • 33
  • 39
  • java.nio.file.NoSuchFileException: C:\Users\Public\Pictures\SamplePictures at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79) at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102) at sun.nio.fs.WindowsFileCopy.copy(WindowsFileCopy.java:99) at sun.nio.fs.WindowsFileSystemProvider.copy(WindowsFileSystemProvider.java:277) at java.nio.file.Files.copy(Files.java:1219) at Main.main(Main.java:14) – user1311422 Apr 12 '12 at 16:46
  • 1
    That's nice, but, as I said, your code will not work because you're trying to do a recursive copy with a function that cannot do recursive copies. Take a look at the API link that I provided. – Jon7 Apr 12 '12 at 16:53
  • By recursive copy, do you mean the directory and the files and directories within samplepictures. If so - I have changed the path to link directly to a single .jpg file with the same error. Apologies if im missing your point. – user1311422 Apr 12 '12 at 17:12
  • No problem. What did you end up doing to fix it? – Jon7 Apr 12 '12 at 17:17
  • The directory "Sample pictures" had a space in it. I thought java would complain because of the spaces, so I renamed it "SamplePictures". However, this didn't update the path. Another problem that occurred was my nwdir. I thought the path would be where I wanted the file. This is correct, but it also needs the file name. – user1311422 Apr 12 '12 at 17:40
4

Came across here looking for a NIO Java7 approach to recursively copy a directory to another location. This can be done with Files.walkFileTree as Jon7 mentioned in the other anwer. This code I got for a simple directory copy:

final Path srcDir, final Path dstDir;
Files.walkFileTree(srcDir, new SimpleFileVisitor<Path>() {
    public FileVisitResult visitFile( Path file, BasicFileAttributes attrs ) throws IOException {
        return copy(file);
    }
    public FileVisitResult preVisitDirectory( Path dir, BasicFileAttributes attrs ) throws IOException {
        return copy(dir);
    }
    private FileVisitResult copy( Path fileOrDir ) throws IOException {
        Files.copy( fileOrDir, dstDir.resolve( srcDir.relativize( fileOrDir ) ) );
        return FileVisitResult.CONTINUE;
    }
});

For a more detailed example which also handles file attributes and overwriting of existing files, see http://docs.oracle.com/javase/tutorial/essential/io/examples/Copy.java .

pakat
  • 286
  • 2
  • 5
  • Beware that `srcDir.relativize( fileOrDir )` will throw a `ProviderMismatchException` if you use this to copy across different file systems, for example, from a ZipFile to default. – Dilum Ranatunga Jun 30 '14 at 08:15
2

This is how I have managed to copy a file from one location to another:

import java.io.IOException;
import static java.nio.file.StandardCopyOption.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class App  {

 public static void main(String[] args)
 {
    Path source = Paths.get("E:/myFile.pdf");
    Path nwdir = Paths.get("F:");
    try
    { 
       Files.copy(source, nwdir.resolve(source.getFileName()), REPLACE_EXISTING);
       System.out.println("File Copied");
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
 }

}
black_belt
  • 6,601
  • 36
  • 121
  • 185