c# - ejemplo - FileSystemWatcher no dispara eventos
filesystemwatcher windows service c# (4)
Acabamos de tener un problema muy similar, donde mover una carpeta no activó los eventos esperados. La solución fue copiar la carpeta completa, en lugar de simplemente moverla.
DirectoryCopy(".", ".//temp", True)
Private Shared Sub DirectoryCopy( _
ByVal sourceDirName As String, _
ByVal destDirName As String, _
ByVal copySubDirs As Boolean)
'' Get the subdirectories for the specified directory.
Dim dir As DirectoryInfo = New DirectoryInfo(sourceDirName)
If Not dir.Exists Then
Throw New DirectoryNotFoundException( _
"Source directory does not exist or could not be found: " _
+ sourceDirName)
End If
Dim dirs As DirectoryInfo() = dir.GetDirectories()
'' If the destination directory doesn''t exist, create it.
If Not Directory.Exists(destDirName) Then
Directory.CreateDirectory(destDirName)
End If
'' Get the files in the directory and copy them to the new location.
Dim files As FileInfo() = dir.GetFiles()
For Each file In files
Dim temppath As String = Path.Combine(destDirName, file.Name)
file.CopyTo(temppath, False)
Next file
'' If copying subdirectories, copy them and their contents to new location.
If copySubDirs Then
For Each subdir In dirs
Dim temppath As String = Path.Combine(destDirName, subdir.Name)
DirectoryCopy(subdir.FullName, temppath, true)
Next subdir
End If
End Sub
Por alguna razón, mi FileSystemWatcher
no está FileSystemWatcher
ningún evento en absoluto. Quiero saber cada vez que se cree, elimine o cambie de nombre un nuevo archivo en mi directorio. _myFolderPath
se está configurando correctamente, lo he comprobado.
Aquí está mi código actual:
public void Setup() {
var fileSystemWatcher = new FileSystemWatcher(_myFolderPath);
fileSystemWatcher.NotifyFilter = NotifyFilters.LastAccess |
NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
fileSystemWatcher.Changed += FileSystemWatcherChanged;
fileSystemWatcher.Created += FileSystemWatcherChanged;
fileSystemWatcher.Deleted += FileSystemWatcherChanged;
fileSystemWatcher.Renamed += FileSystemWatcherChanged;
fileSystemWatcher.Filter = "*.*";
fileSystemWatcher.EnableRaisingEvents = true;
}
private void FileSystemWatcherChanged(object sender, FileSystemEventArgs e)
{
MessageBox.Show("Queue changed");
listBoxQueuedForms.Items.Clear();
foreach (var fileInfo in Directory.GetFiles(_myFolderPath, "*.*", SearchOption.TopDirectoryOnly))
{
listBoxQueuedForms.Items.Add(fileInfo));
}
}
Mi problema era que esperaba que ciertas acciones provocaran el evento FileSystemWatcher
Changed
. Por ejemplo, mover un archivo (hacer clic y arrastrar) desde el escritorio a la ubicación observada no generó un evento sino que copió un archivo existente y pegó una nueva copia del mismo (creando un nuevo archivo en el sistema de archivos y no simplemente moviendo) uno existente) causó que el evento Changed
se levante.
Mi solución fue agregar todos los NotifyFilter
a mi FileSystemWatcher
. De esta manera, se me notificará en todos los casos en que FileSystemWatcher
pueda notificarme.
Tenga en cuenta que no es del todo intuitivo / obvio en cuanto a qué filtros le notificarán para casos específicos. Por ejemplo, esperaba que si incluía FileName
me notificarían de cualquier cambio en el nombre de un archivo existente ... en vez de eso, los Attributes
parecen manejar ese caso.
watcher.NotifyFilter = NotifyFilters.Attributes |
NotifyFilters.CreationTime |
NotifyFilters.FileName |
NotifyFilters.LastAccess |
NotifyFilters.LastWrite |
NotifyFilters.Size |
NotifyFilters.Security;
Parece que estás creando FileSystemWatcher como una variable local en el método de configuración. Por supuesto, esto quedará fuera del alcance al final del método y puede que se esté arreglando en ese momento, eliminando así los relojes.
Intente crear el FSW en un punto donde se mantendrá (por ejemplo, una variable de nivel de programa) y vea si eso lo soluciona.
Utilice este setter para habilitar el disparador:
watcher.EnableRaisingEvents = true;