Pregunta

Estoy un poco confundido con todas estas nuevas clases de archivos de E / S en JDK7.

Digamos, tengo una Path y quiero cambiar el nombre del archivo que representa. ¿Cómo se especifica el nuevo nombre, cuando nuevamente se espera una 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 ? La manipulación de enlaces simbólicos

El problema es: Tengo que hacerlo con archivos cuyos nombres y ubicaciones son conocidos en tiempo de ejecución. Por lo tanto, lo que necesito, es un método seguro (sin excepcionales efectos secundarios) para crear un nuevo nombre-Camino de algún antiguo nombre-Path.

Path newName(Path oldName, String newNameString){
    /* magic */ 
}
¿Fue útil?

Solución

Usted tiene una cadena de ruta y es necesario crear una instancia de Path. Usted puede hacer esto con el método getPath o resolver. Aquí está una manera:

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 se comprueba si el padre es nulo (se parece a su solución no hacerlo).

Otros consejos

En JDK7, Files.move () proporciona una sintaxis corta y concisa para cambiar el nombre de 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 de archivo usando Path.resolveSibling () y la usamos Files.move () para hacer el cambio de nombre real.

OK, 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"));

Si se echa un vistazo a Apache Commons IO hay una clase llamada FileNameUtils . Esto lo hace un montón de cosas WRT. presentar los nombres de ruta y que (entre otras cosas) de forma fiable dividir los nombres de ruta, etc. Creo que debería conseguir que en gran medida a lo que desea.

Si la ruta de destino es idéntica a la ruta de origen a excepción del nombre del archivo , que pasará a llamarse en lugar de moverse.

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

/home/me/file456

Si usted no puede conseguir Java para hacer lo que quiera con Unix recomiendo scripts de Python (dirigido por el programa Java). Python tiene obtener apoyo para Unix scripting y no es Perl :) Esto puede parecer poco elegante para usted, pero realmente en un programa más amplio que va a beneficiarse del uso de la herramienta adecuada para el trabajo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top