¿Fiable File.renameTo () alternativa en Windows?

De JavaFile.renameTo() Es problemático, sobre todo en Windows, parece. Como elDocumentación de la API dice,

Muchos aspectos del comportamiento de este método son inherentemente dependientes de la plataforma: la operación de cambio de nombre puede no ser capaz de mover un archivo de un sistema de archivos a otro, podría no ser atómica, y podría no tener éxito si un archivo con la ruta de acceso abstracta de destino ya existe. El valor de retorno siempre debe verificarse para asegurarse de que la operación de cambio de nombre fue exitosa.

En mi caso, como parte de un procedimiento de actualización, necesito mover (renombrar) un directorio que pueda contener gigabytes de datos (muchos subdirectorios y archivos de diferentes tamaños). El movimiento siempre se realiza dentro de la misma partición / unidad, por lo que no es realmente necesario mover físicamente todos los archivos en el disco.

Ahíno debería cualquier bloqueo de archivos en el contenido del directorio que se va a mover, pero aún así, con bastante frecuencia, renameTo () no puede hacer su trabajo y devuelve falso. (Supongo que quizás algunos bloqueos de archivos caduquen de forma arbitraria en Windows).

Actualmente tengo un método alternativo que utiliza copiar y eliminar, pero esto apesta porque puede tardarmucho de tiempo, dependiendo del tamaño de la carpeta. También estoy considerando simplemente documentar el hecho de que el usuario puede mover la carpeta manualmente para evitar horas de espera, potencialmente. Pero el Camino Correcto obviamente sería algo automático y rápido.

Así que mi pregunta es,¿Conoce un enfoque alternativo y confiable para hacer un movimiento rápido / cambiar el nombre de Java en Windows?, ya sea con JDK plano o alguna biblioteca externa. O si sabes unafácil forma de detectar y liberar cualquier bloqueo de archivos para una carpeta determinada ytodos sus contenidos (posiblemente miles de archivos individuales), eso también estaría bien.

Editar: En este caso particular, parece que nos escapamos usando solorenameTo() teniendo en cuenta algunas cosas más; veresta respuesta.

Respuestas a la pregunta(14)

Su respuesta a la pregunta