watcher ejemplo c# filesystemwatcher

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;