El evento FileSystemWatcher Changed se genera dos veces

Resuelto user214707 asked hace 15 años • 0 respuestas

Tengo una aplicación en la que busco un archivo de texto y, si se realizan cambios en el archivo, estoy usando el controlador de OnChangedeventos para manejar el evento. Estoy usando NotifyFilters.LastWriteTimepero aún así el evento se activa dos veces. Aquí está el código.

public void Initialize()
{
   FileSystemWatcher _fileWatcher = new FileSystemWatcher();
  _fileWatcher.Path = "C:\\Folder";
  _fileWatcher.NotifyFilter = NotifyFilters.LastWrite;
  _fileWatcher.Filter = "Version.txt";
  _fileWatcher.Changed += new FileSystemEventHandler(OnChanged);
  _fileWatcher.EnableRaisingEvents = true;
}

private void OnChanged(object source, FileSystemEventArgs e)
{
   .......
}

En mi caso, se OnChangedllama dos veces, cuando cambio el archivo de texto version.txty lo guardo.

user214707 avatar Nov 19 '09 23:11 user214707
Aceptado

Me temo que este es un error/característica bien conocido de la FileSystemWatcherclase. Esto es de la documentación de la clase:

Es posible que observe en determinadas situaciones que un único evento de creación genera varios eventos creados que son manejados por su componente. Por ejemplo, si usa un componente FileSystemWatcher para monitorear la creación de nuevos archivos en un directorio y luego lo prueba usando el Bloc de notas para crear un archivo, es posible que vea dos eventos creados generados aunque solo se haya creado un archivo. Esto se debe a que el Bloc de notas realiza múltiples acciones del sistema de archivos durante el proceso de escritura. El Bloc de notas escribe en el disco en lotes que crean el contenido del archivo y luego los atributos del archivo. Otras aplicaciones pueden funcionar de la misma manera. Debido a que FileSystemWatcher monitorea las actividades del sistema operativo, se detectarán todos los eventos que activen estas aplicaciones.

Ahora bien, este fragmento de texto trata sobre el Createdevento, pero lo mismo se aplica también a otros eventos de archivos. En algunas aplicaciones, es posible que pueda solucionar este problema utilizando la NotifyFilterpropiedad, pero mi experiencia dice que a veces también es necesario realizar algunos filtrados duplicados manuales (trucos).

Hace un tiempo marqué una página con algunos consejos de FileSystemWatcher . Quizás quieras revisarlo.

Jørn Schou-Rode avatar Nov 19 '2009 17:11 Jørn Schou-Rode

"Solucioné" ese problema usando la siguiente estrategia en mi delegado:

// fsw_ is the FileSystemWatcher instance used by my application.

private void OnDirectoryChanged(...)
{
   try
   {
      fsw_.EnableRaisingEvents = false;

      /* do my stuff once asynchronously */
   }

   finally
   {
      fsw_.EnableRaisingEvents = true;
   }
}
David Brabant avatar May 06 '2010 11:05 David Brabant