2010-12-03 15 views
6

Quiero leer de un archivo y luego eliminarlo, al mismo tiempo evitando que otros procesos accedan a él. ¿Cómo se puede lograr esto?Bloquear un archivo y eliminarlo sin soltar primero el candado

FileLock no funcionará porque debe liberar el bloqueo y cerrar el canal antes de poder llamar a File.delete(). Mi preocupación es que después de liberar el bloqueo, otro proceso pueda bloquearlo y comenzar a leer antes de que se elimine el archivo.

Estoy usando Java 5 y actualizar a 6 no es una opción en este momento.

+0

El problema que describes solo ocurre en Windows. ¿Esa es la plataforma? – EJP

+0

Pude reproducir este problema en Mac OS X también. – Tom

+0

@EJP - Puede que lo estés leyendo demasiado literalmente. El problema no es que "TIENE que liberar el bloqueo ANTES de que pueda llamar a File.delete()". Puede llamar a File.delete() antes de liberar el bloqueo, sin embargo, la eliminación no funcionará. El código se ejecutará pero el método devolverá falso y silenciosamente fallará. – Scrubbie

Respuesta

5

No sé si eso es posible, pero una solución simple es utilizar los permisos y los usuarios del sistema operativo para asegurarse de que solo su proceso pueda leer el archivo.

Otro enfoque es cambiar el nombre del archivo a una cadena generada aleatoriamente y luego bloquear, leer, desbloquear y luego eliminar el archivo renombrado. En teoría, otro programa podría adivinar el nombre del archivo y leer el archivo justo después de que se haya desbloqueado, pero antes de que se elimine. Pero en la práctica probablemente estarás bien.

+0

Creo que este enfoque funcionará. He visto comentarios en otros hilos que indican que el cambio de nombre es un proceso atómico en la mayoría de las JVM si el origen y el destino están en el mismo directorio (más específicamente, cuando están en el mismo volumen del sistema de archivos). – Scrubbie

+0

Nota al margen: java.nio.file.StandardCopyOption.ATOMIC_MOVE se asegurará de que sea atómico. – Ryan

1

¿Se puede mover el archivo a una ubicación alternativa (donde otros procesos potenciales no pueden encontrarlo) y luego hacer su trabajo allí? Si no, ¿qué hay de borrar los datos en el archivo antes de liberar el bloqueo?

+0

Tengo el mismo problema, podría renombrar el archivo y moverme a otro lugar, pero todavía no tuve suerte para eliminarlo – stenly

Cuestiones relacionadas