2011-06-06 9 views
13

Seguí el tutorial de Java7 nio2 Watching a Directory for Changes para supervisar recursivamente todo el contenido de un directorio con el código de muestra WatchDir.java.Java7 WatchService - Error de acceso denegado al intentar eliminar directorios anidados recursivamente vistos (solo Windows)

Si bien esto funciona bien en Linux y Mac, en Windows (probado en Vista y 7), al intentar eliminar carpetas anidadas y vistas utilizando Windows Explorer falla el mensaje "Acceso denegado: necesita permiso para realizar esta acción "cuando existe un archivo en uno de los directorios anidados".

Por ejemplo, si miro un árbol de carpetas anidadas en Windows:

-- Folder A 
    -- Folder A1 
     -- File F 

y tratar de eliminar la carpeta A, consigo el dicho error Acceso denegado. Sin embargo, funciona bien si:

  • eliminar la carpeta A1 a continuación, elimine la carpeta A
  • Eliminar archivo F a continuación, elimine la carpeta A

¿Hay una manera de utilizar el WatchService nio2 para ver de forma recursiva una directorio anidado, pero no actúa como si un programa estuviera accediendo a archivos anidados?

Respuesta

14

Si está viendo un directorio en Windows, entonces la implementación de WatchService tiene un manejador abierto para ese directorio (esa es la forma en que funciona Windows). Ese identificador abierto no impide que se elimine el directorio, pero evita que el padre del directorio se elimine inmediatamente. Tan pronto como elimine el directorio vigilado, se cerrará el identificador pero es posible que intente eliminar el directorio antes de que se cierre el identificador. Cuando eso suceda obtendrás el acceso denegado que estás viendo. Supongo que funciona bien para usted si lo vuelve a intentar y esto se debe a que el identificador se cerrará cuando vuelva a intentarlo.

Sun JRE en Windows puede usar la capacidad del subárbol de vigilancia de Windows si especifica el modificador ExtendedWatchEventModifier.FILE_TREE en la llamada register, lo que puede evitar este problema ya que solo crea un identificador de archivo.

+0

Gracias por proporcionar la nota sobre el modificador FILE_TREE específico de Windows. Hubo un comentario similar (que me perdí) en el error relacionado en la base de datos de errores de Java 7: http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=76a42b61021a94ffffffffa049f7587fd4149?bug_id=6972833 –

+0

También tenga en cuenta que en Eclipse , Tuve que reducir el Error causado por la Restricción de acceso en rt.jar a una Advertencia. Ver http://lkamal.blogspot.com/2008/09/eclipse-access-restriction-on-library.html –

Cuestiones relacionadas