2012-01-10 211 views
8

Estoy encontrando un problema recurrente en una aplicación que rastrea el contenido de archivos dentro de un directorio, basado en la API de Java 7 WatchService. Cuando el sistema de archivos subyacente activa un evento de modificación en un archivo, quiero calcular su SHA-256 de inmediato.E/S Java: Asegurar que un archivo no esté bloqueado por otro proceso antes de cualquier operación de r/w

Pero a menudo ocurre que otro proceso tiene el archivo abierto (es decir, Word), lo que detiene un bloqueo exclusivo y evita que mi aplicación de cualquier operación de lectura/escritura. Si se crea ninguna Corriente/Canal contra el archivo abierto, un FileNotFoundException o una FileSystemException para la API de nio se lanza con un mensaje como:

El proceso no tiene acceso al archivo porque está siendo utilizado por otro proceso

No pude encontrar una solución que detectaría tales casos sin enmascarar una "real" FileNotFoundException cuando el archivo no existe realmente en el fs.

He tenido la idea de verificar la existencia a través de File.exists y luego, si se produce una excepción FileNotFoundException al abrir una secuencia, podría inferir que el archivo está bloqueado. ¡Estoy abierto a cualquier aporte sobre esto!

Gracias!

+0

siempre encontrar una solución a esto? –

+0

Terminé usando la heurística mencionada, si File.exists devuelve verdadero dentro del bloque catch de FileNotFoundException, lo interpreto como un archivo bloqueado. – sylvain

Respuesta

1

¿Has probado a bloquear el archivo tú mismo? Asumiría que solo puedes adquirir un candado si no está bloqueado y existe.

http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#tryLock%28%29

+0

No pude llamar a tryLock() ya que las excepciones mencionadas se producen cuando intento obtener un FileChannel a través de RandomAccessFile o FileOutputStream. – sylvain

+0

En ese caso, parece que tiene que verificar la excepción que se produce cuando intenta acceder a estos archivos. No veo el sentido de tryLock si no puede llamarlo si el archivo está bloqueado. –

+1

Supongo que las aplicaciones nativas pueden tener bloqueos más restrictivos que los disponibles dentro de la JVM. – sylvain

0

compartir documentos al otro lado de los procesos es difícil, especialmente cuando no se utiliza sistemas de archivos dedicados (como pueden ser las EFP) .. no creo que Java API de bloqueo puede ayudar mucho, creo que está en de la manera correcta con su idea de la estrategia try/fail ... Usando java 7 podría usar un WatchService para monitorear cambios de archivos y luego actuar de acuerdo a los requisitos de su negocio ... ¿Qué tipo de sistema usa? Windows mantiene asas de archivos durante la eternidad ...

HTH Jerome

+0

De hecho, ya tengo un hilo WatchService escuchando eventos FS, que se ejecutan solo en Windows por el momento. De todos modos, sabía que no habría una manera de acceder a esos archivos bloqueados, pero me sorprende que no haya una API dentro de java.io o java.nio para probar su accesibilidad. – sylvain

Cuestiones relacionadas