2012-05-16 26 views
6

Estoy tratando de crear una función robusta de eliminación de carpetas recursivas.FindFirstFile devuelve acceso denegado

Con los directorios normales funciona bastante bien.

El problema aparece cuando creo un direcory "Hardcore", como:

C: \ test \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ ... \ x \ x \ x

La longitud de esto es alrededor de 25000 (menos que el límite de MSDN: 32,767). Básicamente creé este directorio recursivamente hasta que falló la función CreatDirectory.

Ahora, lo más extraño es, que mi función es capaz de eliminar 2 directorios entonces el FindFirstFile falla con 0x5:

\\?\C:\test\x\ ... \x\x\x\*.* < no error 
\\?\C:\test\x\ ... \x\x\*.*  < no error 
\\?\C:\test\x\ ... \x\*.*  < access denied 

(puedo volver a ejecutar el que, la aplicación es lenta mastica la carpeta, 2 por 2, probablemente hasta que la longitud del camino sea bastante pequeña)

Estoy ejecutando FindFirstFile para verificar si la carpeta está vacía.

  • ¿Hay algún tipo de limitación que esté menos documentada?
  • ¿El FindFirstFile simplemente no funciona? (¿con errores?)
  • ¿Me falta algún tipo de autorización de NTFS?
  • otra cosa ...

EDIT: NOTA IMPORTANTE: si corro el programa paso a paso lentamente ... entonces nada va a fallar.

+1

por favor muéstranos tu código eliminado –

+0

El código es enorme, y no me parece útil publicarlo. – lerosQ

+0

He hecho esto exactamente varias veces y nunca tuve un problema; el problema es más probable en tu código. Al menos intente reducirlo a un ejemplo mínimo para ver si es algo obvio. – Luke

Respuesta

7

Probablemente experimente algo así como un escáner de virus, un indexador o una solución de copia de seguridad continua que tenga un identificador en el directorio. Si el Servicio de Index Server está configurado para indexar esa carpeta, por ejemplo.

Intentar eliminar una carpeta o archivo que esté abierto que no sea con el indicador FILE_SHARE_DELETE causará ACCESS_DENIED.

Para confirmar esto, use Process Monitor para ver las aperturas y cierres de cualquier cosa que coincida con su ruta.

(Por supuesto, también confirmo que llamó a FindClose).

+0

El Servicio de Indexación estaba buscando en la carpeta más profunda ... siempre. – lerosQ

+0

Mi problema fue que los permisos de acceso eran incorrectos en el archivo al que estaba tratando de acceder. Parece que es una solución 'duh', pero verificaría las propiedades del archivo-> seguridad y me aseguraré de que el grupo de acceso correcto pueda acceder a los archivos, ya que es el caso más obvio de 'ACCESS_DENIED', porque ... no se puede acceder los archivos = P – mgrandi