2009-06-02 18 views
13

Estoy usando .net 2.0 filewatcher para ver una carpeta de archivos nuevos. Funciona perfectamente, excepto cuando pongo más de ~ 80 archivos a la vez. El evento simplemente ya no se dispara. Es como si el vigilante de archivos estuviera configurado para realizar un seguimiento de cierta cantidad de archivos..Net FileWatcher falla para ~ 80 + archivos

Por el momento le he pedido al usuario que no ponga más de 50 archivos a la vez y eso parece funcionar, pero me gustaría solucionarlo para que cientos de archivos puedan soltarse en la carpeta a la vez.

Aquí está el código que estoy usando para el evento. Es algo bastante estándar, nada lujoso.


FileWatcher = new FileSystemWatcher(); 
FileWatcher.Path = ConfigurationManager.AppSettings["FolderOfFilesToWatch"]; 
FileWatcher.NotifyFilter = NotifyFilters.FileName; 
FileWatcher.Filter = "*_*_*.*"; 
FileWatcher.Created += new FileSystemEventHandler(watcher_Created); 
FileWatcher.EnableRaisingEvents = true; 


static void watcher_Created(object sender, FileSystemEventArgs e) 
{ 
Console.Write(e.Name); 
} 

¿Alguna idea?

+0

véase [Consideraciones de cambios de archivo en sistemas de alto volumen] (http: // MSDN. microsoft.com/en-us/library/ded0dc5s.aspx). –

Respuesta

14

Probablemente necesite aumentar FileSystemWatcher. InternalBufferSize. De forma predeterminada, FileSystemWatcher utiliza un búfer más pequeño para el rendimiento, y puede desbordarse si se producen demasiados cambios en un corto período de tiempo.

Intente configurar un tamaño de búfer mayor para evitar que ocurra.

+2

Solo tenga mucho cuidado: según MSDN: "El aumento del tamaño del búfer es costoso, ya que proviene de una memoria no paginada que no se puede intercambiar en el disco, por lo que debe mantener el búfer lo más pequeño posible. Para evitar un desbordamiento del búfer, use NotifyFilter y las propiedades IncludeSubdirectories para filtrar las notificaciones de cambios no deseados. " –

+0

@ocdecio: Sí. Sin embargo, ya está usando NotifyFilter, así que solo se trataría de si está rastreando subdirectorios.Su pedido específico era rastrear "cientos" de archivos, lo que requerirá un tamaño de búfer un poco más grande que el tamaño predeterminado de 4k. –

2

Uso FileWatcher pero adopté un enfoque de "cinturón y tirantes". Cada vez que obtengo un evento de FileWatcher me quedo y reviso los archivos que no había visto antes (en mi caso tengo un catálogo de archivos). Créame, habrá un momento en que obtendrá miles de archivos caídos en una carpeta y debe tener otra salvaguarda para dar cuenta de todos ellos.

Otra alternativa que puede considerar es change journals, aunque está (AFAIK) limitada a los discos conectados a su máquina, mientras que puede usar FileWatcher para ver también las rutas UNC.

1

Es posible que esté excediendo el recuento de ThreadPool de su sistema. Cuando FileSystemWatcher desencadena un evento, lo hace desde un hilo recuperado de este grupo. Es posible perder estos eventos si no tiene suficientes hilos asignados a su ThreadPool.

http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

Como los demás, especialmente, '' ocdecio han señalado que es bueno para no confiar por completo el FileSystemWatcher. Es notoriamente inconsistente bajo mucha carga.

0

lo creas o no Las acciones de CIFS tienen algunas configuraciones propias a las que debes prestarle atención. 50 es aparentemente el valor predeterminado para la mayoría del conteo de comandos de archivos compartidos (no sé lo suficiente sobre esto para saber algo más que el término ... lo siento)

De todos modos, este problema nos ha estado afectando un poco, y afortunadamente nuestro proveedor de almacenamiento tuvo la amabilidad de darnos pistas sobre este problema.

echar un vistazo aquí y ver si esto podría ayudar a obtener más de la magia 50 ...

http://support.microsoft.com/kb/810886

Cuestiones relacionadas