2009-12-16 16 views
16

Estoy un poco confundido con todas estas nuevas clases de E/S de archivos en JDK7.¿Cómo cambio el nombre (no muevo) un archivo en JDK7?

Digamos que tengo un Path y quiero cambiar el nombre del archivo, representa.
¿Cómo especifico el nuevo nombre cuando de nuevo se espera 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: ¿Por qué necesito JDK7? Manejo de enlaces simbólicos!

El problema es que tengo que hacerlo con archivos, cuyos nombres y ubicaciones se conocen en tiempo de ejecución. Entonces, lo que necesito, es un método seguro (sin efectos colaterales excepcionales) para crear un nuevo nombre-Ruta de acceso de un antiguo nombre-Ruta.

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

Respuesta

6

Usted tiene una cadena de ruta y es necesario crear una instancia de Path. Puede hacer esto con el método getPath o resolver. Aquí hay una forma:

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

Tenga en cuenta que comprueba si parent es nulo (parece que su solución no lo hace).

0

Si la ruta de destino es idéntica a la ruta de origen excepto por el nombre del archivo, que pasará a llamarse en lugar de mover.

Así que para su ejemplo, la ruta debe ser moveto

/home/me/file456 
+1

Entonces, ¿puedo crear una nueva 'Ruta'? ¿Hay algo más simple que: Path newName = Paths.get (name.getParent(). ToString() + pathSeparator + "newName"); ? –

+0

Sí, ahora la pregunta es: cómo crear dicha ruta de forma segura, para que ninguna circunstancia excepcional provoque su error. –

+0

Podría intentar describir cómo se puede tomar la ruta original, quitar el nombre 'file123' concatenar 'file456' en su lugar e invocar 'name.moveTo()' pero como realmente no sé Java, estaría adivinando .Lo que estoy ** seguro ** es que un * movimiento * se convierte en un * rename * si solo el nombre del archivo es diferente. – pavium

1

Si se echa un vistazo a Apache Commons IO hay una clase llamada FileNameUtils. Esto hace un montón de cosas wrt. los nombres de las rutas de archivos y (entre otras cosas) dividirán de manera confiable los nombres de las rutas, etc. Creo que eso te ayudará a lograr lo que deseas.

+0

Lo siento, necesito API con enlaces simbólicos. Todas estas cosas de Apache Commons son, en el mejor de los casos, compatibles con Java-5, pero principalmente Java-1.4. –

+0

¿No le ayuda solo en términos de dividir y volver a ensamblar nombres de archivos, y puede usar Java 7 symlink aware stuff para realizar la copia/cambio de nombre? –

+0

Buena funcionalidad para el manejo de enlaces simbólicos es proporcionada solo por JDK7, ya que tiene enlaces de bajo nivel (nivel binario) para el sistema operativo. –

4

bien, después de probar todo lo que fuera, parece que encontró el método correcto:

// 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

Si no puede hacer que Java haga lo que desea con Unix, recomiendo los scripts de Python (ejecutados por su programa Java). Python tiene soporte para scripting Unix y no es Perl :) Esto puede sonar poco elegante para usted, pero realmente en un programa más grande se beneficiará de usar la herramienta adecuada para el trabajo.

47

En JDK7, Files.move() proporciona una sintaxis corta y concisa para renombrar archivos:

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

En primer lugar estamos recibiendo el Camino hacia el nuevo nombre del archivo mediante Path.resolveSibling() y la usamos Files.move() para hacer el cambio de nombre real .

Cuestiones relacionadas