2012-05-10 17 views
7

Un programma errato quando si tenta di spostare file da una directory a un'altra. Dopo molto debugging ho individuato l'errore scrivendo un piccolo programma di utilità che sposta semplicemente un file da una directory a un'altra (codice sotto). Si scopre che mentre lo spostamento dei file sul filesystem locale funziona correttamente, il tentativo di spostare un file su un altro file system fallisce.Java non riesce a spostare (rinominare) un file quando il file risultante si trova su un altro filesystem

Perché è questo? La domanda potrebbe essere specifica per una piattaforma: stiamo eseguendo Linux su ext3, se questo è importante.

E la seconda domanda; dovrei usare qualcos'altro rispetto al metodo renameTo() della classe File? Sembra che funzioni solo su filesystem locali.

test (eseguito come root):

touch /tmp/test/afile 

java FileMover /tmp/test/afile /root/ 
The file move was successful 

touch /tmp/test/afile 

java FileMover /tmp/test/afile /some_other_disk/ 
The file move was erroneous 

Codice:

import java.io.File; 

public class FileMover { 
    public static void main(String arguments[]) throws Exception { 
     boolean success; 
     File file = new File(arguments[0]); 
     File destinationDir = new File(arguments[1]); 
     File destinationFile = new File(destinationDir,file.getName()); 
     success = file.renameTo(destinationFile); 
     System.out.println("The file move was " + (success?"successful":"erroneous")); 
    } 
} 

risposta

16

Dalla documentazione di File.renameTo:

[...] l'operazione di ridenominazione non potrebbe essere in grado di spostare un file da un filesystem ad un altro [...]

L'ovvia soluzione sarebbe quella di copiare il file "manualmente" aprendo un nuovo file, scrivere il contenuto nel file ed eliminare il vecchio file.

Si potrebbe anche provare il metodo FileUtils.moveFile da Apache Commons.

+0

Errr ... non ha ancora caricare la vostra risposta, mentre Ho composto il mio :), moveFile è il salvatore +1 – mprabhat

+0

Il tuo suggerimento su Apache Commons era esattamente il mio prossimo passo. Grazie per una risposta informativa che risponde effettivamente a entrambe le domande! – oligofren

+1

Per aggiungere alla risposta eccellente già fornita in precedenza, la chiamata di sistema utilizzata in rinominare restituisce EXDEV se oldpath e newpath non si trovano sullo stesso file system montato. Infatti un programma come "mv" gestisce questa situazione facendo una copia esplicita seguita dall'operazione di cancellazione. – ghostkadost

6

Javadoc in soccorso:

Molti aspetti del comportamento di questo metodo sono intrinsecamente dipendente dalla piattaforma: L'operazione di rinomina potrebbe non essere in grado di spostare un file da un file system a un altro, potrebbe non essere atomico, e potrebbe non riuscire se esiste già un file con il nome di percorso astratto di destinazione . Il valore restituito deve sempre essere verificato per verificare che l'operazione di ridenominazione abbia avuto esito positivo.

Si noti che la classe File definisce il metodo di spostamento per spostare o rinominare un file in modo indipendente dalla piattaforma.

1

Dalla documentazione:

rinomina il file indicato con questo nome di percorso astratto.

Molti aspetti del comportamento di questo metodo sono intrinsecamente dipendente dalla piattaforma: L'operazione di rinomina potrebbe non essere in grado di spostare un file da un file system a un altro, potrebbe non essere atomica, e potrebbe non avere successo se esiste già un file con il nome di percorso astratto di destinazione . Il valore restituito deve sempre essere verificato per verificare che l'operazione di ridenominazione abbia avuto esito positivo.

Se si desidera spostare il file tra i file diverso sistema, è possibile utilizzare Apache moveFile

-1

tua ider è errore beause/some_other_disk/è url relativa ma completamente url, non riesce a trovare l'url ho esempio

java FileMover D: \ Eclipse33_workspace_j2ee \ test \ src \ a \ a.txt D: \ Eclipse33_workspace_j2ee \ test \ src Il file mossa ha avuto successo

java FileMover D: \ Eclipse33_workspace_j2ee \ test \ src \ a \ a.txt \ Eclipse33_workspace_j2ee \ test \ src

La mossa del file era difettoso:

risultato è url è errore

+0

qualsiasi percorso che inizia con '/' è un percorso assoluto (su unices). Quindi no. guarda le risposte sopra per qualcosa che risponde effettivamente alla domanda. – oligofren

Problemi correlati