web-dev-qa-db-fra.com

FileSystemWatcher ne déclenche pas d'événements

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));
    }
}
27
gwin003

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.

24
Chris

Mon problème était que je m'attendais à ce que certaines actions provoquent le déclenchement de l'événement FileSystemWatcherChanged. 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;
24
MoMo

Utilisez ce setter pour activer le déclencheur:

watcher.EnableRaisingEvents = true;
9
Luca Ziegler