2010-01-06 18 views
8

Sin tener en cuenta mi última publicación, he encontrado el origen del problema. Estoy usandoCambiar el nombre de un archivo sin utilizar renameTo() - Java

a.renameTo(b) 

cuando b no existe. La razón por la que no existe es porque hay un enlace simbólico, por lo que si b es /usr/name/folder/file, entonces b realmente es /mnt/MountTest porque el enlace simbólico corresponde a ese directorio.

Entonces, la pregunta es, ¿hay alguna forma alternativa de cambiar el nombre de un archivo en Java utilizando un valor de cadena? De no ser así, ¿cómo puede este procedimiento de cambio de nombre hacerse de forma diferente?

Respuesta

5

Un cambio de nombre la cambiaría de nombre ... si estuviera en el mismo sistema de archivos.

Si falla el renameTo(), deberá copiarlo en la nueva ubicación y luego eliminar el original.

3

El problema no es que se trata de un enlace simbólico; el problema es que no se puede cambiar el nombre de forma atómica en los sistemas de archivos. El metaproblema es que las operaciones del archivo Java están mal diseñadas, no arrojan las excepciones adecuadas y no proporcionan códigos de error cuando algo falla.

1

¿Qué tal:

a.renameTo(new File("/your/path/here/"); 
+0

eso no funcionará porque el archivo no existe en la nueva ruta del archivo ... el cambio de nombre se usa para imitar un "mv", esencialmente moviendo el archivo de un directorio a otro – Hristo

+1

@Hristo: En realidad, eso es precisamente lo que me causó problemas: las personas que describen renombreTo como el equivalente de "mv" . mv conoce los sistemas de archivos, mientras que renameTo no lo es. Si intenta migrar de un disco/partición a otro, actúa como una secuencia cp y rm, que renombrar a A no lo hace. – Ken

4

Creo que son cosas confusas. Un archivo java.util.File no representa un archivo en algún sistema de archivos. Representa una ruta a un archivo.

5

Renombrar archivos también es muy problemático en los sistemas de archivos. Ver http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4073756. Los comentaristas del informe de errores publicaron algunos ejemplos de código y también señalaron que puede usar Process.exec. Tanto Apache Commons IO y guayaba y Google tienen utilidades para mover archivos de forma segura, así:

+1

Apache link was dead, por favor actualice. – saikosen

Cuestiones relacionadas