2009-12-16 15 views
16

Sono un po 'confuso con tutte queste nuove classi di I/O su file in JDK7.Come rinominare (non spostare) un file in JDK7?

Diciamo che ho uno Path e voglio rinominare il file, rappresenta.
Come specificare il nuovo nome, quando è previsto di nuovo Path?

Path p = /* path to /home/me/file123 */; 
Path name = p.getName(); /* gives me file123 */ 
name.moveTo(/* what now? */); /* how to rename file123 to file456? */ 

NOTA: Perché ho bisogno di JDK7? Gestione dei collegamenti simbolici !

Il problema è: devo farlo con i file, quali nomi e posizioni sono noti in fase di esecuzione. Quindi, quello di cui ho bisogno, è un metodo sicuro (senza effetti collaterali eccezionali) per creare un nuovo nome-Percorso di qualche vecchio nome-Percorso.

Path newName(Path oldName, String newNameString){ 
    /* magic */ 
} 

risposta

6

Hai una stringa di percorso ed è necessario creare un'istanza di percorso. Puoi farlo con il metodo getPath o risolvere. Ecco un modo:

Path dir = oldFile.getParent();   
    Path fn = oldFile.getFileSystem().getPath(newNameString); 
    Path target = (dir == null) ? fn : dir.resolve(fn);   
    oldFile.moveTo(target); 

Nota che controlla se genitore è nullo (sembra che la tua soluzione non lo faccia).

0

Se il percorso di destinazione è identico al percorso di origine tranne che per il nome del file, verrà rinominato anziché spostato.

Così, per il tuo esempio, il percorso dovrebbe essere moveto

/home/me/file456 
+1

Quindi posso creare un nuovo 'percorso'? C'è qualcosa di più semplice di: Path newName = Paths.get (name.getParent(). ToString() + pathSeparator + "newName"); ? –

+0

Sì, ora la domanda è: come creare tale percorso in modo sicuro, in modo che nessuna circostanza eccezionale possa causare il fallimento. –

+0

Potrei tentare di descrivere come si può prendere il percorso originale, rimuovere il nome 'file123' concatenare 'file456' e invece invocare 'name.moveTo()' ma poiché non conosco davvero Java, direi .Quello di cui sono ** sicuro ** è che un * spostamento * diventa un * rinominare * se solo il nome file è diverso. – pavium

1

Se si dà un'occhiata a Apache Commons IO c'è una classe chiamata FileNameUtils. Questo fa un sacco di roba. i nomi dei percorsi dei file e (tra le altre cose) saranno in grado di separare in modo affidabile i nomi dei percorsi, ecc. Penso che dovresti farti largo cammino verso ciò che vuoi.

+0

Siamo spiacenti, ho bisogno di API sensibili ai collegamenti simbolici. Tutte queste cose di Apache Commons sono al massimo compatibili con Java-5, ma principalmente Java-1.4. –

+0

Non ti aiuta solo in termini di suddivisione e riassemblaggio di nomi di file, e puoi usare Java 7 per la funzione symlink per eseguire effettivamente la copia/rinomina? –

+0

Una buona funzionalità per la gestione dei collegamenti simbolici è fornita solo da JDK7, poiché dispone di collegamenti di livello basso (a livello binario) al sistema operativo. –

4

OK, dopo aver provato tutto fuori, sembra che io trovato il metodo giusto:

// my helper method 
Path newName(Path oldFile, String newNameString){ 
    // the magic is done by Path.resolve(...) 
    return oldFile.getParent().resolve(newNameString); 
} 

// so, renaming is done by: 
oldPath.moveTo(newName(oldFile, "newName")); 
0

Se non riesci a far sì che Java faccia ciò che vuoi con Unix, ti consiglio gli script Python (eseguiti dal tuo programma Java). Python ha il supporto per gli script Unix e non è Perl :) Questo potrebbe sembrare poco elegante per te, ma in realtà in un programma più ampio trarrai vantaggio dall'utilizzo dello strumento giusto per il lavoro.

47

In JDK7, Files.move() fornisce una sintassi breve e concisa per rinominare i file:

Path newName(Path oldName, String newNameString){ 
    return Files.move(oldName, oldName.resolveSibling(newNameString)); 
} 

Prima stiamo ottenendo il percorso del nuovo nome del file utilizzando Path.resolveSibling() e l'usiamo Files.move() di fare la ridenominazione reale .