2011-09-09 44 views
5

Estoy usando FileSystemWatcher para escanear una carpeta donde se cargan los archivos desde la aplicación web. Tengo más de 1000 archivos cargados en la carpeta. Ahora, el problema es que FileSystemWatcher comenzó cuando se copió el primer archivo, a veces, no funciona para todos los archivos. Cualquier sugerencia será altamente apreciable.FileSystemWatcher no funciona correctamente

Respuesta

8

El FileSystemWatcherdocumentation dice que (el énfasis es mío):

El sistema operativo Windows notifica a su componente del archivo cambia en un buffer creado por el FileSystemWatcher. Si hay muchos cambios en poco tiempo, el búfer puede desbordarse. Esto hace que el componente pierda de vista los cambios en el directorio, y solo proporcionará una notificación general. Aumentando el tamaño del buffer con la propiedad InternalBufferSize es cara, ya que viene de la memoria no paginada que no se puede intercambiar en el disco, así que mantenga el buffer lo suficientemente pequeño como para no perder ningún evento de cambio de archivo. Para evitar un desbordamiento de búfer, utilice las propiedades IncludeSubdirectories de NotifyFilter y para que pueda filtrar las notificaciones de cambio no deseado .

.

Tenga en cuenta que un FileSystemWatcher puede perder un evento cuando se excede el tamaño de la memoria intermedia . Para evitar eventos faltantes, siga estas pautas:

Aumente el tamaño del búfer estableciendo la propiedad InternalBufferSize.

Evite ver archivos con nombres de archivo largos, porque un nombre de archivo largo contribuye a llenar el búfer. Considere renombrar estos archivos usando nombres más cortos.

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

Si ha intentado todo lo anterior y todavía no es lo suficientemente confiable para usted, me temo que la única solución será para suscribirse al evento Error y enumerar manualmente el contenido del directorio cada vez que se produce.

3

dar más detalles sobre la respuesta de Jon:

Hay otra solución posible posponer un desbordamiento de búfer de occuring. Al manejar los eventos que supervisa, por ejemplo, el evento Creado, tan rápido como sea posible, elimina la información vinculada al evento del búfer para que pueda reclamar este espacio.

Para acelerar esto, puede optar por procesar los archivos de forma asincrónica. Tan pronto como se desencadena el evento, se pone en cola la ruta completa al archivo en una cola que, a su vez, será procesada por un hilo de trabajo. El deber del controlador de eventos vinculado al evento Creado se reduce a agregar una cadena (la ruta del archivo) a una cola.

Por ejemplo:

public class FileProcessor 
{ 
    private readonly Queue<string> files = new Queue<string>(); 

    public void EnqueueFile(string path) 
    { 
     files.Enqueue(path); 
    } 
} 

El código del controlador de eventos adjunto al evento creado a continuación, se puede minimizar a esto:

static void file_Created(object sender, FileSystemEventArgs e) 
{ 
    _fileProcessor.EnqueueFile(e.FullPath); 
} 

Puede encontrar más información sobre este incluyendo código de ejemplo () en una publicación que escribí hace dos años:

http://cgeers.com/2009/08/14/monitoring-a-directory/

Cuestiones relacionadas