web-dev-qa-db-fra.com

Surveiller plusieurs dossiers à l'aide de FileSystemWatcher

Quel est le meilleur moyen de surveiller plusieurs dossiers (pas des sous-répertoires) en utilisant FileSystemWatcher en C #?

22
Bi.

Je ne pense pas que FSW prenne en charge la surveillance de plusieurs dossiers. Il vous suffit donc d’en instancier un par dossier que vous souhaitez surveiller. Vous pouvez toutefois indiquer aux gestionnaires d’événements les mêmes méthodes, qui devraient fonctionner comme vous le souhaitez.

20
Factor Mystic

Le moyen le plus simple consiste à créer plusieurs instances de FileSystemWatcher object.

http://www.c-sharpcorner.com/UploadFile/mokhtarb2005/FSWatcherMB12052005063103AM/FSWatcherMB.aspx

Vous devrez vous assurer que vous gérez correctement les événements entre les deux dossiers:

Bien que certains événements courants, tels que Tels que la copie ou le déplacement d'un fichier, ne correspondent pas Directement à un événement, ces événements provoquent la génération d'événements . Lorsque vous copiez un fichier, le système Déclenche un événement créé dans le répertoire Dans lequel le fichier a été copié , Mais ne déclenche aucun événement dans l'original . annuaire. Lorsque vous déplacez un fichier , Le serveur déclenche deux événements: un événement Supprimé dans le répertoire source, Suivi d'un événement Created dans le répertoire cible .

Par exemple, vous créez deux instances De FileSystemWatcher. FileSystemWatcher1 est défini pour surveiller "C:\Mes documents" et FileSystemWatcher2 est défini pour surveiller "C:\Vos documents". Maintenant, si vous copiez Un fichier de "Mes documents" dans "Vos Documents", un événement créé sera Déclenché par FileSystemWatcher2, mais aucun événement est levé pour FileSystemWatcher1. Contrairement à la copie, Déplacer un fichier ou un répertoire générerait Deux événements. Dans l'exemple précédent, si vous avez déplacé un fichier de "Mes Documents" vers "Vos documents", un événement Créé serait déclenché par FileSystemWatcher2 et un événement supprimé serait déclenché par FileSystemWatcher

Lien vers FileSystemEventArgs

12
kemiller2002

Par défaut, FileSystemWatcher ne prend en charge que la surveillance d’un seul répertoire parent. Pour surveiller plusieurs répertoires frères, vous devez créer plusieurs instances de FileSystemWatcher.

Vous pouvez toutefois essayer de tromper ce problème en tirant parti de la capacité de FileSystemWatcher à inclure des sous-répertoires. Vous pouvez créer un point de jonction NTFS (lien symbolique) en tant que sous-répertoire à partir du répertoire que vous regardez. Mark Russinovich de Sysinternals a un utilitaire appelé Junction pour simplifier la création et la gestion de liens symboliques.

Notez que vous ne pouvez créer que des liens symboliques vers des répertoires sur votre ordinateur local.

3
Tim Trout

Vous devez instancier plusieurs instances de l'objet FileSystemWatcher. Bien que vous puissiez lier les événements à la même méthode et utiliser l'objet émetteur pour déterminer quelle FileSystemWatcher a déclenché l'événement.

        var fsw1 = new FileSystemWatcher();
        var fsw2 = new FileSystemWatcher();
        FileSystemEventHandler fsw_changed = delegate(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine("{0} - {1}", (sender as FileSystemWatcher).Path, e.ChangeType);
        };
        fsw1.Changed += fsw_changed;
        fsw2.Changed += fsw_changed;
2
BAH

Bien que c’était une vieille question, j’ai décidé de répondre à cette question, car je ne trouvais nulle part une bonne réponse. 

L'objectif était donc de surveiller plusieurs dossiers (pas des sous-répertoires) à l'aide de FileSystemWatcher? Voici ma suggestion:

using System;
using System.IO;
using System.Security.Permissions;
using System.Collections.Generic;

namespace MultiWatcher
// ConsoleApplication, which monitors TXT-files in multiple folders. 
// Inspired by:
// http://msdn.Microsoft.com/en-us/library/system.io.filesystemeventargs(v=vs.100).aspx

{
    public class Watchers
    {
        public static void Main()
        {
            Run();

        }

        [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
        public static void Run()
        {
            string[] args = System.Environment.GetCommandLineArgs();

            // If a directory is not specified, exit program.
            if (args.Length < 2)
            {
                // Display the proper way to call the program.
                Console.WriteLine("Usage: Watcher.exe PATH [...] [PATH]";
                return;
            }
            List<string> list = new List<string>();
            for (int i = 1; i < args.Length; i++)
            {
                list.Add(args[i]);
            }
            foreach (string my_path in list)
            {
                Watch(my_path);
            }

            // Wait for the user to quit the program.
            Console.WriteLine("Press \'q\' to quit the sample.");
            while (Console.Read() != 'q') ;
        }
        private static void Watch(string watch_folder)
        {
            // Create a new FileSystemWatcher and set its properties.
            FileSystemWatcher watcher = new FileSystemWatcher();
            watcher.Path = watch_folder;
            /* Watch for changes in LastAccess and LastWrite times, and
               the renaming of files or directories. */
            watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
               | NotifyFilters.FileName | NotifyFilters.DirectoryName;
            // Only watch text files.
            watcher.Filter = "*.txt";

            // Add event handlers.
            watcher.Changed += new FileSystemEventHandler(OnChanged);
            watcher.Created += new FileSystemEventHandler(OnChanged);
            watcher.Deleted += new FileSystemEventHandler(OnChanged);
            watcher.Renamed += new RenamedEventHandler(OnRenamed);

            // Begin watching.
            watcher.EnableRaisingEvents = true;
        }

        // Define the event handlers.
        private static void OnChanged(object source, FileSystemEventArgs e)
        {
            // Specify what is done when a file is changed, created, or deleted.
            Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
        }

        private static void OnRenamed(object source, RenamedEventArgs e)
        {
            // Specify what is done when a file is renamed.
            Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
        }
    }
}
2
Ciove

Pouvez-vous simplement utiliser plusieurs instances de FileSystemWatcher, une pour chaque répertoire?

1
Charlie Salts

ou vous pouvez passer les chemins en code, pour marquer une certaine plage du domaine regardé comme ceci:

lien moniteur multiple

j'espère que cela t'aides.

0
Paradigm