FileSystemWatcher vs sondeo para observar cambios en archivos

Resuelto Jon Tackabury asked hace 15 años • 13 respuestas

Necesito configurar una aplicación que observe los archivos que se crean en un directorio, tanto localmente como en una unidad de red.

FileSystemWatcher¿Sería la mejor opción realizar una encuesta con un temporizador? He usado ambos métodos en el pasado, pero no de manera extensiva.

¿Qué problemas (rendimiento, confiabilidad, etc.) existen con cualquiera de los métodos?

Jon Tackabury avatar Oct 27 '08 21:10 Jon Tackabury
Aceptado

He visto fallar el observador del sistema de archivos en entornos de producción y prueba. Ahora lo considero una conveniencia, pero no lo considero confiable. Mi patrón ha sido observar los cambios con el observador del sistema de archivos, pero realizar encuestas ocasionalmente para detectar cambios en los archivos que faltan.

Editar: si tiene una interfaz de usuario, también puede brindarle a su usuario la capacidad de "actualizar" los cambios en lugar de realizar una encuesta. Combinaría esto con un observador del sistema de archivos.

Jason Jackson avatar Oct 27 '2008 14:10 Jason Jackson

El mayor problema que he tenido es que faltan archivos cuando el búfer se llena. Es muy fácil de arreglar: simplemente aumente el buffer. Recuerde que contiene los nombres de los archivos y los eventos, así que increméntelo a la cantidad esperada de archivos (prueba y error). Utiliza memoria que no se puede paginar, por lo que podría obligar a otros procesos a paginar si la memoria se agota.

Aquí está el artículo de MSDN sobre el búfer: Propiedad FileSystemWatcher..::.InternalBufferSize

Por MSDN:

Aumentar el tamaño del búfer es costoso, ya que proviene de una memoria no paginada que no se puede intercambiar al disco, así que mantenga el búfer lo más pequeño posible. Para evitar un desbordamiento del búfer, utilice las propiedades NotifyFilter e IncludeSubdirectories para filtrar notificaciones de cambios no deseados.

Usamos 16 MB debido a que se espera un lote grande al mismo tiempo. Funciona bien y nunca pierde un archivo.

También leemos todos los archivos antes de comenzar a procesar incluso uno... guardamos los nombres de los archivos en caché de forma segura (en nuestro caso, en una tabla de base de datos) y luego los procesamos.

Para problemas de bloqueo de archivos, genero un proceso que espera a que se desbloquee el archivo esperando un segundo, luego dos, luego cuatro, etcétera. Nunca hacemos encuestas. Ha estado en producción sin errores durante aproximadamente dos años.

 avatar Jun 05 '2009 15:06

También es FileSystemWatcherposible que se pierdan cambios durante las horas punta, si el número de cambios en cola desborda el búfer proporcionado. Esto no es una limitación de la clase .NET per se, sino de la infraestructura Win32 subyacente. Según nuestra experiencia, la mejor manera de minimizar este problema es retirar las notificaciones de la cola lo más rápido posible y tratarlas en otro hilo.

Como mencionó @ChillTemp anteriormente, es posible que el observador no funcione en recursos compartidos que no sean de Windows. Por ejemplo, no funcionará en absoluto en unidades Novell montadas.

Estoy de acuerdo en que un buen compromiso es realizar una encuesta ocasional para detectar cualquier cambio omitido.

Brent Rockwood avatar Oct 27 '2008 14:10 Brent Rockwood