2008-09-11 5 views
17

Hay muchas publicaciones en Internet sobre la función de API ReadDirectoryChangesW que faltan archivos cuando hay mucha actividad de archivos. La mayoría culpa a la velocidad a la que se llama el bucle de función ReadDirectoryChangesW. Esta es una suposición incorrecta. La mejor explicación que he visto es en el siguiente post, el comentario el lunes 14 de abril de, 2008 2:15:27 PMCómo mantener ReadDirectoryChangesW de cambios de archivos faltantes

http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/4465cafb-f4ed-434f-89d8-c85ced6ffaa8/

El resumen es que los informes la función de ReadDirectoryChangesW archivo cambia cuando salen de la cola de grabación de archivos retrospectivos, no como se agregan. Y si se agregan demasiados antes de comprometerse, pierde aviso en algunos de ellos. Puede ver esto con su implementación, si solo escribe un programa para generar más de 1000 archivos en un directorio muy rápido. Simplemente cuente cuántos avisos de eventos de archivos recibe y verá que hay momentos en que no los recibirá todos.

La pregunta es, ¿alguien ha encontrado un método confiable para usar la función ReadDirectoryChangesW sin tener que vaciar el volumen cada vez? Esto no está permitido si el usuario no es un administrador y también puede tomar algún tiempo para completar.

Respuesta

1

Si la API no es confiable, una solución alternativa puede ser su única opción. Eso, por supuesto, probablemente implica el seguimiento de los últimos nombres modificados y de archivos. Lo que esto no significa es que necesita sondear cuando busca cambios, en su lugar, puede usar FileSystemWatcher como medio para activar la verificación.

Así que si usted no perder de vista los últimos 50-100 veces la ReadDirectoryChangesW sucedió /FSW evento, y ves que se está llamando rápidamente, puede detectar esto y desencadenar la condición especial para obtener todos los archivos que se han cambiado (y establecer una bandera para evitar eventos de FSW falsos en el futuro temporalmente) en unos pocos segundos.

Dado que algunas personas están confundidas en los comentarios acerca de esta solución, les propongo que controlen qué tan rápidos están llegando los eventos desde ReadDirectoryChangesW y cuando llegan demasiado rápido, intenten intentar una solución (generalmente un barrido manual de un directorio).

+1

Esto funcionaría durante aproximadamente el 99% del tiempo. ¿Qué sucede si un archivo en otro directorio (diferente del que tiene muchos cambios de archivos) es el que se omite? Deberías escanear el directorio en busca de cambios, pero te pierdes el cambio de un solo archivo en otro. –

+0

La clase FileSystemWatcher es una forma .NET de ajustar ReadDirectoryChangesW, por lo que no, eso no ayuda. – Garen

+0

Mi respuesta fue más acerca de detectar el # de eventos dentro de un período de tiempo para desencadenar la solución para ReadDirectoryChangesW. – hova

0

Me encontré con el mismo problema. Pero no encontré una solución que garantice la obtención de todos los eventos. En varias pruebas, pude saber que la función ReadDirectoryChangesW se debe volver a llamar lo más rápido posible después de que se devuelva la función GetQueuedCompletionStatus. Supongo que si la velocidad de procesamiento del sistema de archivos es mucho más rápida que la velocidad de procesamiento de mi aplicación, la aplicación podría perder algunos eventos.

De todos modos, separé una lógica de análisis de una lógica de monitorización y coloqué una lógica de análisis en un hilo.

+0

Resolví con éxito el problema usando algo similar. Ponga en cola los eventos o escríbalos en un archivo para su posterior procesamiento. Escribirlos en el disco fue la clave para mí. Eso puede parecer lento, pero los discos se almacenan en caché y la sobrecarga es menor que un DB. Mi programa refleja aproximadamente 1 TB por día de cambios de archivos: cientos de miles de archivos por día. – SilentSteel

1

Nunca hemos visto que ReadDirectoryChangesW sea 100% confiable. Pero, la mejor manera de manejarlo es separar el "informe" del "manejo".

Mi implementación tiene un hilo que tiene un solo trabajo, para volver a poner en cola todos los eventos. Luego un segundo hilo para procesar mi cola intermedia. Básicamente, desea impedir el informe de eventos lo menos posible.

En situaciones de CPU elevadas, también puede impedir el informe de eventos de vigilantes.

+0

Como no tengo la reputación suficiente para comentar arriba, diré que la mejor solución es muy buena. Te lleva "casi allí" en el 99% de los casos. Agregue 1 cosa más a eso, un repaso total periódico de las carpetas que está mirando para buscar cambios. – Lompican

Cuestiones relacionadas