El evento FileSystemWatcher Changed se genera dos veces
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 OnChanged
eventos para manejar el evento. Estoy usando NotifyFilters.LastWriteTime
pero 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 OnChanged
llama dos veces, cuando cambio el archivo de texto version.txt
y lo guardo.
Me temo que este es un error/característica bien conocido de la FileSystemWatcher
clase. 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 Created
evento, pero lo mismo se aplica también a otros eventos de archivos. En algunas aplicaciones, es posible que pueda solucionar este problema utilizando la NotifyFilter
propiedad, 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.
"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;
}
}