c# - Usando FileSystemWatcher para monitorear un directorio
winforms copy (3)
Estoy usando una aplicación de Windows Forms para monitorear un directorio y mover los archivos que se le han caído a otro directorio.
Por el momento, copiará el archivo en otro directorio, pero cuando se agregue otro archivo, terminará sin mensaje de error. Algunas veces copia dos archivos antes de terminar en el tercero.
¿Esto es porque estoy usando una aplicación de Windows Form en lugar de una aplicación de consola? ¿Hay alguna manera de detener el programa y seguir mirando el directorio?
private void watch()
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.*";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
}
private void OnChanged(object source, FileSystemEventArgs e)
{
//Copies file to another directory.
}
El problema fueron los filtros de notificación. El programa intentaba abrir un archivo que aún estaba copiando. Eliminé todos los filtros de notificación, excepto LastWrite.
private void watch()
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastWrite;
watcher.Filter = "*.*";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
}
La razón puede ser que watcher se declare como variable local para un método y se recolecte basura cuando el método finaliza. Debes declararlo como un miembro de la clase. Pruebe lo siguiente:
FileSystemWatcher watcher;
private void watch()
{
watcher = new FileSystemWatcher();
watcher.Path = path;
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.*";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
}
private void OnChanged(object source, FileSystemEventArgs e)
{
//Copies file to another directory.
}
No proporcionó el código de manejo de archivos, pero supongo que cometió el mismo error que todos los demás al escribir esto: el evento de guardián de archivos se generará tan pronto como se cree el archivo. Sin embargo, tomará algún tiempo para que el archivo finalice. Tome un tamaño de archivo de 1 GB, por ejemplo. El archivo puede ser creado por otro programa (Explorer.exe copiándolo de algún lado) pero tomará minutos terminar ese proceso. El evento se levanta en el momento de la creación y debe esperar a que el archivo esté listo para copiarse.
Puede esperar que un archivo esté listo utilizando this función en un bucle.