2013-07-03 14 views
6

Sono nel mezzo dell'automazione di una serie di azioni che facciamo molto per guadagnare un po 'di tempo. Ciò comporta lo spostamento di file e l'avvio di alcuni batch.Java 7 ATOMIC_MOVE fornisce eccezioni

In questa particolare situazione, sto tentando di copiare un file da una posizione a un'altra posizione. Tutto funziona correttamente, fino a quando non cerco di utilizzare l'opzione di copia ATOMIC_MOVE. Questo è il mio codice:

private void copyToDropFolder(Datafile datafile, String company) throws IOException{ 
    Path datafilePath = datafile.getDataPath(); 
    String dropFolder = locations.getLocationFor("default"); 
    Path dropPath = Paths.get(dropFolder, company.toUpperCase(),locations.getLocationFor("drop"), datafile.getFileName()); 
    Files.copy(datafilePath, dropPath, StandardCopyOption.ATOMIC_MOVE); 
} 

Ho controllato e risolto le posizioni dei datafilePath e dropPath, sono entrambi validi. Ho provato con le altre 2 opzioni di copia standard e il programma funziona correttamente. Solo per ATOMIC_MOVE ottengo un UnsupportedOperationException. Non è che io abbia assolutamente bisogno di quella specifica opzione, ma sono curioso di sapere perché non funzionerei. Non trovo davvero nessun altro rapporto su questo problema. Lo sto facendo su una macchina Windows 7.

Mi manca qualcosa? O l'ATOMIC_MOVE non è supportato?

+0

Perché provate e "ATOMIC_MOVE" un'operazione _copy_? Ciò non ha senso. O vuoi usare 'link()'? – fge

+0

Quale tipo di file system stai provando? Può darsi che l'operazione non sia supportata (http://docs.oracle.com/javase/tutorial/essential/io/move.html) –

+0

@fge Hai ragione ... quando la guardi in quel modo, non ha senso. Ma avere un'opzione ATOMIC_MOVE in un enum chiamato StandardCopyOption non ha molto senso: /. Tu lo hai indicato bene, non ci ho pensato in questo modo. Per ora, non voglio davvero usarlo, ho appena provato e fallisce. Sono perplesso sul motivo per cui fallirebbe. – anothernoc

risposta

14

Come API says, ATOMIC_MOVE non è supportato per copy(), ma solo per move().

+0

Grazie! ho perso quello. Mi sono concentrato interamente su [questo] (http://docs.oracle.com/javase/7/docs/api/java/nio/file/StandardCopyOption.html) – anothernoc

2

ATOMIC_MOVE è per operazioni di spostamento, non operazioni di copia.

D'altra parte, è possibile creare i cosiddetti "hard link" utilizzando Files.createLink(). C'è anche createSymbolicLink() ma probabilmente non è quello che vuoi qui.

E, naturalmente, .createLink() funzionerà solo se i percorsi di origine e destinazione si trovano sullo stesso file system.