IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

FileSystemWatcher Changed, événement déclenché deux fois


Sujet :

C#

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2013
    Messages : 46
    Points : 40
    Points
    40
    Par défaut FileSystemWatcher Changed, événement déclenché deux fois
    Bonjour,

    J'utilise la classe FileSystemWatcher pour analyser le comportement d'un fichier.

    Mon problème est que l’événement se déclenche deux fois.
    Une solution fonctionne pour moi avec les NotifyFilters,

    watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.Size;

    Mais lorsque j'essaye de modifier mon ficher avec notepad pas de problème l'event se déclenche une seule fois, mais avec notepad++ deux fois... WTF?

    J'ai besoin de faire une appli stable, pouvez vous m'expliquer pourquoi modifier un fichier avec un éditeur différent change quelque chose? Et si cela aura une réelle influence pour mon appli?

    Merci d'avance,

    Benmaster

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Quel évènement veux-tu gérer, et que veux-tu faire avec ?

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2013
    Messages : 46
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    J'utilise l'événement "changed" pour recuperer les données d'un fichier XML a chaque fois qu'il est modifié.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    OK

    Le problème, c'est que si le programme qui modifie le fichier l'écrit en plusieurs fois, tu auras autant d'évenement Changed, qui vont s'enchainer très rapidement.

    La solution est de temporiser ; si tu n'as pas de nouvel évènement pendant un certain temps, c'est qu'a priori la modification est terminée.

    - quand tu reçois un évènement Changed, tu démarres un timer (2 secondes par exemple)
    - quand le délai du timer est écoulé, tu traites l'évènement
    - si un autre évènement se produit avant que le délai soit écoulé, tu remets le timer à 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    private HashSet<string> _modifiedFiles = new HashSet<string>();
    private System.Timers.Timer _timer;
     
    ...
     
        // Initialisation du timer
        _timer = new System.Timers.Timer
        {
            Interval = 2000,
            AutoReset = false,
        };
        _timer.Elapsed += _timer_Elapsed;
     
    ...
     
    void watcher_Changed(object sender, FileSystemEventArgs e)
    {
        // ajouter à la liste des fichiers modifiés
        lock (_modifiedFiles)
        {
            _modifiedFiles.Add(e.FullPath);
        }
        // redémarrer le timer
        _timer.Stop();
        _timer.Start();
    }
     
    void _timer_Elapsed(object sender, EventArgs e)
    {
        // Copier la liste des fichiers modifiés et la vider
        string[] modifiedFiles;
        lock(_modifiedFiles)
        {
            modifiedFiles = _modifiedFiles.ToArray();
            _modifiedFiles.Clear();
        }
     
        // Traitement des fichiers
        ProcessFiles(modifiedFiles);
    }

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2013
    Messages : 46
    Points : 40
    Points
    40
    Par défaut
    Merci pour ta réponse, j'essaye ça et je te dit lorsque mon problème et resolu

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2013
    Messages : 46
    Points : 40
    Points
    40
    Par défaut
    Bonjour Bonjour,
    Désole pour le temps de réponse.

    Bon J'ai essaye cette technique la théorie j'ai compris, mais pas la pratique...
    J'ai essaye comme ça mais il y a plusieurs erreurs:

    Pouvez vous m'aidez s'il vous plait? c'est quoi le HashSet<string>? un type de variable?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.IO;
    using System.Timers;
    using System.Security.Permissions;
     
    private HashSet<string> _modifiedFiles = new HashSet<string>();
    private System.Timers.Timer _timer;
     
     
    namespace ConsoleApplicationFileChange
    {
        class Program
        {
            static void Main(string[] args)
            {
     
                // Initialisation du timer
                _timer = new System.Timers.Timer
                {
                    Interval = 2000,
                    AutoReset = false,
                };
                _timer.Elapsed += _timer_Elapsed;
     
                //
                CreateWatcher();
                Console.WriteLine("Enter at any time to finish the project");
                Console.ReadLine();
            }
     
            static public void CreateWatcher()
            {
                //Create a new FileSystemWatcher.
                FileSystemWatcher watcher = new FileSystemWatcher();
     
                //Set the filter to only catch TXT files.
                watcher.Filter = "towatch.txt";
     
                //Subscribe to the Created event.
                watcher.Changed += new FileSystemEventHandler(watcher_FileChanged);
     
                //Set the path to C:\Temp\
                watcher.Path = @"C:\Users\Benoit\Desktop";
     
                //Enable the FileSystemWatcher events.
                watcher.EnableRaisingEvents = true;
            }
     
            static void watcher_FileChanged(object sender, FileSystemEventArgs e)
            {
                //A new .TXT file has been created in C:\Temp\
                Console.WriteLine("A {0} file has been Changed!", e.Name);
     
                    // ajouter à la liste des fichiers modifiés
                    lock (_modifiedFiles)
                    {
                        _modifiedFiles.Add(e.FullPath);
                    }
                    // redémarrer le timer
                    _timer.Stop();
                    _timer.Start();
     
            }
     
                void _timer_Elapsed(object sender, EventArgs e)
                {
                    // Copier la liste des fichiers modifiés et la vider
                    string[] modifiedFiles;
                    lock(_modifiedFiles)
                    {
                        modifiedFiles = _modifiedFiles.ToArray();
                        _modifiedFiles.Clear();
                    }
     
                    // Traitement des fichiers
                    ProcessFiles(modifiedFiles);
                }
        }
    }
    Merci de votre aide

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2013
    Messages : 46
    Points : 40
    Points
    40
    Par défaut Eviter le doublon du FileSystemWatcher !
    Merci merci tomlev, ça marche en utilisant un peu ma tete ahah!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.IO;
    using System.Timers;
    using System.Security.Permissions;
     
    namespace ConsoleApplicationFileChange
    {
        class Program
        {
     
            static private HashSet<string> _modifiedFiles = new HashSet<string>();
            static private System.Timers.Timer _timer;
     
            static void Main(string[] args)
            {
     
                // Initialisation du timer
                _timer = new System.Timers.Timer
                {
                    Interval = 2000,
                    AutoReset = false,
                };
                _timer.Elapsed += _timer_Elapsed;
     
     
                //
                CreateWatcher();
                Console.WriteLine("Enter at any time to finish the project");
                Console.ReadLine();
            }
     
            static public void CreateWatcher()
            {
     
                //Create a new FileSystemWatcher.
                FileSystemWatcher watcher = new FileSystemWatcher();
     
                //Set the filter to only catch TXT files.
                watcher.Filter = "towatch.txt";
     
                //Subscribe to the Created event.
                watcher.Changed += new FileSystemEventHandler(watcher_FileChanged);
     
                //Set the path to C:\Temp\
                watcher.Path = @"C:\Users\Benoit\Desktop";
     
                //Enable the FileSystemWatcher events.
                watcher.EnableRaisingEvents = true;
            }
     
            static void watcher_FileChanged(object sender, FileSystemEventArgs e)
            {
                //A new .TXT file has been created in C:\Temp\
     
                    // ajouter à la liste des fichiers modifiés
                    lock (_modifiedFiles)
                    {
                        _modifiedFiles.Add(e.FullPath);
                    }
                    // redémarrer le timer
                    _timer.Stop();
                    _timer.Start();
     
            }
     
                static void _timer_Elapsed(object sender, EventArgs e)
                {
                    // Copier la liste des fichiers modifiés et la vider
                    string[] modifiedFiles;
                    lock(_modifiedFiles)
                    {
                        modifiedFiles = _modifiedFiles.ToArray();
                        _modifiedFiles.Clear();
                    }
     
                    // Traitement des fichiers
                    //ProcessFiles(modifiedFiles);
                    Console.WriteLine("A file has been Changed!");
                }
        }
    }
    Bon codage!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. onclick sur td se déclenche deux fois
    Par Dark Ryus dans le forum jQuery
    Réponses: 12
    Dernier message: 13/03/2018, 23h15
  2. Réponses: 4
    Dernier message: 11/09/2007, 09h20
  3. Lire deux fois un inputstream
    Par Guybrush dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 05/09/2005, 14h50
  4. Réponses: 14
    Dernier message: 30/03/2005, 21h50
  5. Sélectionner un même enregistrement deux fois...
    Par Manu0086 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 02/02/2004, 13h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo