Estoy usando una aplicación de Windows Forms para monitorear un directorio y mover los archivos colocados en él a otro directorio.
Por el momento, copiará el archivo a otro directorio, pero cuando se agregue otro archivo, terminará sin mensaje de error. A veces copia dos archivos antes de terminar en el tercero.
¿Se debe a que estoy usando una aplicación de Windows Form en lugar de una aplicación de consola? ¿Hay alguna manera de evitar que el programa finalice y seguir viendo el directorio?
private void watch()
{
this.watcher = new FileSystemWatcher();
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.*";
watcher.Changed += OnChanged;
watcher.EnableRaisingEvents = true;
}
private void OnChanged(object source, FileSystemEventArgs e)
{
//Copies file to another directory.
}
public void Dispose()
{
// avoiding resource leak
watcher.Changed -= OnChanged;
this.watcher.Dispose();
}
No proporcionó el código de manejo de archivos, pero supongo que cometió el mismo error que todos cometen al escribir por primera vez tal cosa: el evento filewatcher se generará tan pronto como se cree el archivo. Sin embargo, el archivo tardará algún tiempo en completarse. Tome un tamaño de archivo de 1 GB, por ejemplo. El archivo puede ser creado por otro programa (Explorer.exe copiándolo desde algún lugar) pero tomará unos minutos terminar ese proceso. El evento se genera en el momento de la creación y debe esperar a que el archivo esté listo para copiarse.
Puede esperar a que un archivo esté listo utilizando esta función en un bucle.
fuente
La razón puede ser que el observador se declara como variable local para un método y se recolecta como basura cuando finaliza el método. Debería declararlo como miembro de la clase. Intente lo siguiente:
fuente
watcher
La variable se mantiene viva (no recolectada basura) porque se suscribió al evento Cambiado.true
. No creo que el estado de los controladores de eventos de miembros tenga que ver con la recolección de basura. Creo que EnableRaisingEvents tiene, lo que podría llamar favorablemente, un comportamiento especial en este caso.