Domanda

Sono un po 'confuso con tutte queste nuove classi di file di I / O in JDK7.

Diciamo, ho un Path e desidera rinominare il file che rappresenta. Come faccio a specificare il nuovo nome, quando ancora una volta si prevede un 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 ? Manipolazione di link simbolici

Il problema è: che devo fare con i file i cui nomi e le posizioni sono noti in fase di esecuzione. Allora, che cosa ho bisogno, è un sicura Metodo (senza eccezionali effetti collaterali) per creare un nuovo nome-Path di qualche vecchio nome-Path.

Path newName(Path oldName, String newNameString){
    /* magic */ 
}
È stato utile?

Soluzione

Hai una stringa di percorso ed è necessario creare un'istanza di percorso. È possibile 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); 

Si noti che controlla se genitore è nullo (si presenta come la soluzione di non farlo).

Altri suggerimenti

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));
}

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

OK, dopo aver provato tutto fuori, a quanto pare ho 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"));

Se si dà un'occhiata a Apache Commons IO c'è un classe chiamata FileNameUtils . Questo fa un sacco di roba WRT. i nomi dei file di percorso e che (tra le altre cose) in modo affidabile dividere i nomi di percorso, ecc Penso che dovrebbe ottenere un lungo cammino verso ciò che si desidera.

Se il percorso di destinazione è identico al percorso di origine tranne che per il nome del file , verrà rinominato e non si mosse.

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

/home/me/file456

Se non è possibile ottenere Java per fare quello che vuoi con Unix vi consiglio script Python (gestito dal programma Java). Python ha ottenere supporto per lo scripting Unix e non è Perl :) Questo potrebbe sembrare poco elegante a voi, ma in realtà in un programma più ampio potrai beneficiare di utilizzare lo strumento giusto per il lavoro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top