2013-02-28 24 views
8

Sono nuovo nella classe nio e sto avendo problemi a spostare una directory di file in una directory appena creata.Java: utilizzo di nio Files.copy per spostare la directory

ho creo 2 directory con:

File sourceDir = new File(sourceDirStr); //this directory already exists 
File destDir = new File(destDirectoryStr); //this is a new directory 

Ho poi cerco di copiare i file esistenti nella nuova directory, utilizzando:

Path destPath = destDir.toPath(); 
for (int i = 0; i < sourceSize; i++) { 
    Path sourcePath = sourceDir.listFiles()[i].toPath(); 
    Files.copy(sourcePath, destPath.resolve(sourcePath.getFileName())); 
} 

Questo getta il seguente errore:

Exception in thread "main" java.nio.file.FileSystemException: destDir/Experiment.log: Not a directory 

So che destDir/Experiment.log non è una directory esistente; dovrebbe essere un nuovo file come risultato dell'operazione Files.copy. Qualcuno potrebbe indicare dove la mia operazione sta andando male? Grazie!

+2

Ha 'destDir' esiste sul disco però? Altrimenti potresti doverlo creare usando ['File # mkdirs()'] (http://docs.oracle.com/javase/7/docs/api/java/io/File.html#mkdirs()) prima . – millimoose

+0

Ho eseguito 'destDir.exists()', che restituisce 'True'. Sembra quasi che pensi che "destDir/Experiment.log" dovrebbe essere una directory. Non è questo il caso, però? –

risposta

12

è necessario utilizzare walkFileTree per copiare le directory. Se si utilizza Files.copy su una directory, verrà creata solo una directory vuota.

Dopo codice preso/adattato da http://codingjunkie.net/java-7-copy-move/

File src = new File("c:\\temp\\srctest"); 
File dest = new File("c:\\temp\\desttest"); 
Path srcPath = src.toPath(); 
Path destPath = dest.toPath(); 

Files.walkFileTree(srcPath, new CopyDirVisitor(srcPath, destPath, StandardCopyOption.REPLACE_EXISTING)); 

public static class CopyDirVisitor extends SimpleFileVisitor<Path> 
{ 
    private final Path fromPath; 
    private final Path toPath; 
    private final CopyOption copyOption; 

    public CopyDirVisitor(Path fromPath, Path toPath, CopyOption copyOption) 
    { 
     this.fromPath = fromPath; 
     this.toPath = toPath; 
     this.copyOption = copyOption; 
    } 

    @Override 
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException 
    { 
     Path targetPath = toPath.resolve(fromPath.relativize(dir)); 
     if(!Files.exists(targetPath)) 
     { 
      Files.createDirectory(targetPath); 
     } 
     return FileVisitResult.CONTINUE; 
    } 

    @Override 
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException 
    { 
     Files.copy(file, toPath.resolve(fromPath.relativize(file)), copyOption); 
     return FileVisitResult.CONTINUE; 
    } 
} 
4

Basta fare la directory di destinazione se non esiste.

File sourceDir = new File(source); //this directory already exists 
File destDir = new File(dest); //this is a new directory 
destDir.mkdirs(); // make sure that the dest directory exists 

Path destPath = destDir.toPath(); 
for (File sourceFile : sourceDir.listFiles()) { 
    Path sourcePath = sourceFile.toPath(); 
    Files.copy(sourcePath, destPath.resolve(sourcePath.getFileName())); 
} 

noti che sourceDir.listFiles() sarà anche restituire le directory, che si sia vuole t ricorsivamente, o ignorare ...

+0

Grazie, ma sfortunatamente questo genera ancora lo stesso errore. Ho anche eseguito 'destDir.exists()', che restituisce 'True'. Sembra quasi che pensi che "destDir/Experiment.log" dovrebbe essere una directory. Non è questo il caso, però? –

+0

Ho eseguito il codice a fianco e funziona, purché non ci siano sottodirectory nella directory che sto cercando di copiare ... – RudolphEst

+0

L'unica differenza che posso pensare è che ho bisogno di usare 'for (int i = 0; i

0
for (int i = 0; i < sourceSize; i++) { 
    Path sourcePath = sourceDir.listFiles()[i].toPath(); 
    Files.copy(sourcePath, destPath.resolve(sourcePath.getFileName())); 
} 

Questo è molto strano codice. Hai già ottenuto un conteggio di file da qualche parte, in sourceSize, ma stai chiamando listFiles() per ogni iterazione. Mi sarei aspettato qualcosa di più simile a questo:

for (File file : sourceDir.listFiles()) { 
    Path sourcePath = file.toPath(); 
    Files.copy(sourcePath, destPath.resolve(sourcePath.getFileName())); 
} 
+0

Per motivi che non rientrano nell'ambito di questa domanda, ho bisogno di usare il formato 'int i = 0' .... Ha a che fare con la selezione di numeri casuali e il superamento del numero indice. –

+1

Hai perso completamente il punto. Non è un motivo per continuare a chiamare listFiles() su ogni iterazione. Si sta correndo il rischio di cambiare la directory tra le iterazioni e di elaborare lo stesso file due volte. – EJP

Problemi correlati