149 votes

FileSystemWatcher vs polling pour surveiller les changements de fichiers

Je dois mettre en place une application qui surveille la création de fichiers dans un répertoire, à la fois localement et sur un lecteur réseau.

Le FileSystemWatcher ou l'interrogation d'une horloge serait la meilleure option. J'ai utilisé ces deux méthodes dans le passé, mais pas de manière intensive.

Quels sont les problèmes (performance, fiabilité, etc.) posés par l'une ou l'autre méthode ?

2voto

ThunderGr Points 682

En utilisant à la fois le FSW y Le sondage est une perte de temps et de ressources, à mon avis, et je suis surpris que des développeurs expérimentés le suggèrent. Si vous avez besoin d'utiliser l'interrogation pour vérifier les "ratés de FSW", vous pouvez, bien entendu, vous passer complètement de FSW et n'utiliser que l'interrogation.

Je suis actuellement en train d'essayer de décider si je vais utiliser FSW ou sondage pour un projet que je développe. En lisant les réponses, il est évident que dans certains cas, le TISF couvre parfaitement les besoins, alors que dans d'autres cas, vous devez vous contenter d'une réponse. besoin sondage. Malheureusement, pas de réponse s'est en effet penché sur la question de la performance (s'il y en a), mais seulement en ce qui concerne les problèmes de "fiabilité". Quelqu'un peut-il répondre à cette partie de la question ?

EDIT : nmclean (vous pouvez lire la discussion dans les commentaires, si cela vous intéresse) semble être une explication très rationnelle du fait qu'il peut y avoir des situations où l'utilisation à la fois d'un FSW et d'un sondage est nécessaire. est efficace. Merci de m'éclairer sur ce point (et à tous ceux qui ont la même opinion), nmclean .

1voto

Drua Points 69

Solution de travail pour l'utilisation d'un événement de création au lieu d'un changement

Même pour copier, couper, coller, déplacer.

class Program
{        

        static void Main(string[] args)
        {
            string SourceFolderPath = "D:\\SourcePath";
            string DestinationFolderPath = "D:\\DestinationPath";
            FileSystemWatcher FileSystemWatcher = new FileSystemWatcher();
            FileSystemWatcher.Path = SourceFolderPath;
            FileSystemWatcher.IncludeSubdirectories = false;
            FileSystemWatcher.NotifyFilter = NotifyFilters.FileName;   // ON FILE NAME FILTER       
            FileSystemWatcher.Filter = "*.txt";         
             FileSystemWatcher.Created +=FileSystemWatcher_Created; // TRIGGERED ONLY FOR FILE GOT CREATED  BY COPY, CUT PASTE, MOVE  
            FileSystemWatcher.EnableRaisingEvents = true;

            Console.Read();
        }     

        static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)
        {           
                string SourceFolderPath = "D:\\SourcePath";
                string DestinationFolderPath = "D:\\DestinationPath";

                try
                {
                    // DO SOMETING LIKE MOVE, COPY, ETC
                    File.Copy(e.FullPath, DestinationFolderPath + @"\" + e.Name);
                }
                catch
                {
                }          
        }
}

Solution pour l'observateur de fichiers lors d'un événement de changement d'attribut de fichier utilisant un stockage statique

class Program
{
    static string IsSameFile = string.Empty;  // USE STATIC FOR TRACKING

    static void Main(string[] args)
    {
         string SourceFolderPath = "D:\\SourcePath";
        string DestinationFolderPath = "D:\\DestinationPath";
        FileSystemWatcher FileSystemWatcher = new FileSystemWatcher();
        FileSystemWatcher.Path = SourceFolderPath;
        FileSystemWatcher.IncludeSubdirectories = false;
        FileSystemWatcher.NotifyFilter = NotifyFilters.LastWrite;          
        FileSystemWatcher.Filter = "*.txt";         
        FileSystemWatcher.Changed += FileSystemWatcher_Changed;
        FileSystemWatcher.EnableRaisingEvents = true;

        Console.Read();
    }     

    static void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
    {
        if (e.Name == IsSameFile)  //SKIPS ON MULTIPLE TRIGGERS
        {
            return;
        }
        else
        {
            string SourceFolderPath = "D:\\SourcePath";
            string DestinationFolderPath = "D:\\DestinationPath";

            try
            {
                // DO SOMETING LIKE MOVE, COPY, ETC
                File.Copy(e.FullPath, DestinationFolderPath + @"\" + e.Name);
            }
            catch
            {
            }
        }
        IsSameFile = e.Name;
    }
}

Il s'agit d'une solution de contournement pour ce problème d'événements à déclenchements multiples.

0voto

user2819502 Points 1

Je dirais qu'il faut utiliser le polling, surtout dans un scénario TDD, car il est beaucoup plus facile de simuler la présence de fichiers ou autres lorsque l'événement polling est déclenché que de s'appuyer sur l'événement fsw, plus "incontrôlé". + De plus, j'ai travaillé sur un certain nombre d'applications qui étaient affectées par des erreurs fsw.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X