Pour une raison quelconque, mon FileSystemWatcher
ne déclenche aucun événement. Je veux savoir à chaque fois qu'un nouveau fichier est créé, supprimé ou renommé dans mon répertoire. _myFolderPath
est réglé correctement, j'ai vérifié.
Voici mon code actuel:
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));
}
}
Vous semblez créer le FileSystemWatcher en tant que variable locale dans la méthode d'installation. Bien sûr, cela sortira du cadre à la fin de la méthode et pourrait bien être rangé à ce stade, supprimant ainsi les montres.
Essayez de créer le FSW à un point où il sera conservé (par exemple une variable au niveau du programme) et voyez si cela vous trie.
Mon problème était que je m'attendais à ce que certaines actions provoquent le déclenchement de l'événement FileSystemWatcher
Changed
. Par exemple, déplacer un fichier (cliquer et faire glisser) du bureau vers l'emplacement surveillé n'a pas déclenché un événement mais copié un fichier existant et collé une nouvelle copie de celui-ci (là en créant un nouveau fichier dans le système de fichiers et pas simplement en le déplaçant un événement existant) a déclenché l'événement Changed
.
Ma solution était d'ajouter chaque NotifyFilter
à mon FileSystemWatcher
. De cette façon, je suis averti dans tous les cas où le FileSystemWatcher
est capable de m'avertir.
NOTEZ qu'il n'est pas entièrement intuitif/évident de savoir quels filtres vous avertiront pour des cas spécifiques. Par exemple, je m'attendais à ce que si j'incluais FileName
, je serais informé de toute modification apportée au nom d'un fichier existant ... à la place, Attributes
semble gérer ce cas.
watcher.NotifyFilter = NotifyFilters.Attributes |
NotifyFilters.CreationTime |
NotifyFilters.FileName |
NotifyFilters.LastAccess |
NotifyFilters.LastWrite |
NotifyFilters.Size |
NotifyFilters.Security;
Utilisez ce setter pour activer le déclencheur:
watcher.EnableRaisingEvents = true;