2011-01-31 5 views
5

Estoy buscando una manera confiable de buscar cambios en un directorio.Manera confiable de monitorear cambios de archivos en un directorio usando .NET framework

He intentado utilizar el FileSystemWatcher, pero es bastante impreciso cuando se crean, cambian o eliminan muchos archivos pequeños. Pierde aproximadamente 1 o 2% de los archivos en mis pruebas. Eso es bastante cuando agrega o cambia miles de archivos rápidamente.

He intentado sondear para cambios en diferentes intervalos 500 ms, 2000 ms etc. En este caso recibo demasiados golpes. Eso podría tener algo que ver con la resolución de marcas de tiempo en el objeto FileInfo.

Así que mi pregunta es; ¿Es posible, usando .NET Framework, obtener los cambios en un directorio de manera confiable?

- Cristiano

Respuesta

7

¿Ha intentado aumentar el InternalBufferSize? ¿Qué tamaño lo ha configurado?

De MSDN:


Tenga en cuenta que una FileSystemWatcher puede perder un evento cuando el tamaño del búfer es superado. Para evitar eventos faltantes, siga estas instrucciones: Aumente el tamaño del búfer estableciendo la propiedad InternalBufferSize. Evite viendo archivos con nombres de archivo largos, porque un nombre de archivo largo contribuye para llenar el búfer. Considere renombrando estos archivos usando nombres más cortos .


Mantenga su código de manejo de eventos lo más corto posible.

+0

Gracias, esto parece resolver mis problemas por ahora. No se puede perder archivos con un búfer de 64 KB, debe ejecutar algunas pruebas más para encontrar la configuración óptima. –

4

Sí, correcto seguimiento se realiza utilizando controlador de filtro de sistema de archivos. Tal controlador intercepta todas las solicitudes que van al sistema de archivos justo cuando se envían (antes o después de que lleguen al sistema de archivos). De esta forma, recibirá todas las notificaciones, justo a tiempo (o incluso antes de que ocurra el evento) y podrá controlar qué solicitudes pasan y qué información se pasa con la solicitud.

Puede escribir dicho controlador de filtro usted mismo (~ 6-9 meses-hombre de trabajo para implementarlo correctamente, y luego un montón de tiempo para probarlo) o puede usar nuestro producto CallbackFilter y evitar el desarrollo en modo kernel. CallbackFilter ofrece un controlador preconstruido y API para .NET, VCL y C++ nativo.

+1

Gracias por la sugerencia Eugene, en realidad he examinado su CallbackFilter antes cuando investigaba para un proyecto que se eliminó. Este es un proyecto de pasatiempo, así que necesito mantenerlo simple por ahora. Pero te lo tendrá en cuenta;) –

+3

@Eugene: Esta respuesta ha sido señalada como spam por un par de usuarios. No estoy convencido de que lo sea, porque (a pesar de no ser un experto en el área) parece que su producto realmente * proporciona una solución al problema. Sin embargo, en el futuro es posible que desee considerar hacer un poco más obvio que está promocionando su propio producto. Tal vez un descargo de responsabilidad en la parte inferior o algo así. Y +1 para contrarrestar a los downvotes. –

+1

@Cody Gray: la frase "nuestro ... producto" junto con el nombre de usuario lo dice bastante claro, en cuanto a mí, y esto se ha abordado anteriormente (ambos discutidos en Meta y probados aquí) y aceptado. –

Cuestiones relacionadas