FileSystemWatcher est ton ami



e FileSystemWatcher fait partie de ces petits plus qui font la richesse d'un Framework tel que .NET. Qui n'a jamais eu ce besoin consistant à notifier à un programme qu'un fichier vient d'être modifié, créé ou supprimé ? Imaginez une application destinée à collecter des informations provenant de multiples sources de données hétérogènes afin de mettre à jour un référentiel centralisée. A l'heure du B2B et de l'intégration d'applications, ce besoin rejaillit dès lors qu'il s'agit d'échanger de l'information entre applications. Certains préfèreront dans ce cas utiliser XML, d'autres privilégieront des fichiers Texte au format CSV ou encore des données binaires. Une fois le choix du format effectué, comment implémenter l'échange ? un WebServices me direz-vous ? Effectivement, si cette solution peut paraître séduisante au premier abord, elle n'est malheureusement pas trivial à mettre en oeuvre dans tous les cas. Le client devant posséder une certaine logique d'invocation à travers un objet Proxy SOAP. Certaines "vieilles" applications qui ont l'habitude de vous envoyer un fichier sur un serveur FTP ou un répertoire distant préfèreront sûrement garder cette logique. De plus, le protocole FTP possède de gros avantages par rapport à HTTP. Non seulement il est très bien adapté aux transfert de gros volumes de données mais il permet aussi d'assurer les reprises en cas d'échec de la communication. Chose que les WebServices n'assurent pas aujourd'hui de manière native. Sans compter que l'invocation synchrone via HTTP convient mal aux traitements téléchargement (délais).  De plus, ces données pouvant arriver à n'importe quel moment en fonction des modifications du référentiel et ce, plusieurs fois par jour, comment s'assurer que le système prendra bien en compte les dernières modifications effectuées

Et bien vous avez plusieurs manières d'implémenter un tel système :

1.     Faire du Polling : consiste à vérifier régulièrement qu'aucune modification n'est intervenue. 

2.     Lancer des Tâches de fond (Jobs) à certaines heures,  lorsque ces dates sont connues à l'avance bien entendu.

Si la première est fort coûteuse en temps machine, la deuxième s'accommode mal lorsque les publications sont aléatoires. 

Concrètement, faire du polling consiste à lancer un Thread .NET ou Java qui invoquera la méthode isModified() du fichier texte en question à intervalles réguliers. Ce mécanisme est assez souvent employé dans les serveurs d'application lorsqu'il s'agit de notifier du nouveau déploiement d'une application. 

Regardons ce que propose .NET pour ce genre de situation. 

Fonctionnement du FileSystemWatcher                                                                          


Le FileSystemWatcher est un objet dont le rôle est de vous avertir lorsqu'un nouvel évènement de type Modification Suppression ou Création apparaît sur un fichier donné. L'utilisateur précise les types d'évènements qu'il souhaite gérer et lorsqu'un de ces évènements survient, il se voit notifier par le Framework immédiatement. 

Voyons comment de plus près comment créer un FileSystemWatcher. Soit vous utilisez Visual Studio qui propose le composant dans sa palette d'outils, soit vous développez le code source à la main. Nous choisissons la deuxième approche qui a pour avantage de vous montrer les différentes étapes d'implémentation. Il faut donc :

1.     Créer l’objet FileSystemWatcher

2.     Spécifier le répertoire (et les sous-répertoires) que vous voulez superviser

3.     Définir les types de fichiers concernés via un filtre : *.txtcatalogue*.xml

4.     Spécifier les événements qui nous intéressent : Created, Deleted, Renamed, Changed

5.     Créer les méthodes qui seront appelées lorsqu’un événement survient 

                  // Création de l’objet FileSystemWatcher

                  1) MyWatcher = new System.IO.FileSystemWatcher();

                  // Répertoire c:\ seulement, ne pas traiter ses fils

                  2) MyWatcher.Path = "c:\\";

                  MyWatcher.IncludeSubdirectories = false;

                  // Superviser uniquement les fichiers .txt

                  3) MyWatcher.Filter = "*.txt";

                  // Enable the component to begin watching for changes.

                  MyWatcher.EnableRaisingEvents = true;

                 

                  // Nous spécifions un filtre sur les informations que nous aimerions avoir

                  MyWatcher.NotifyFilter = System.IO.NotifyFilters.LastWrite | System.IO.NotifyFilters.Size;

 

                  4) MyWatcher.Changed += new System.IO.FileSystemEventHandler(this.fileSystemWatcher1_Changed);

 Vous aurez remarqué l’étonnante simplicité de ce code source. Pas plus d’une dizaine de lignes pour configurer l’objet FileSystemWatcher, reste maintenant à implémenter les évènements :

            private void fileSystemWatcher1_Changed(object sender, System.IO.FileSystemEventArgs e)

            {

                  System.IO.FileSystemWatcher watcher2;

                  watcher2 = (System.IO.FileSystemWatcher) sender;

                  Console.WriteLine(e.FullPath + "vient d'être modifié : Evt [" + e.ChangeType + "]");

            }

 

Pour tester le programme, il vous suffit d’ouvrir Notepad et de modifier un fichier au format txt situé sous c:\. Automatiquement, un message apparaît vous indiquant que le fichier en question vient d’être modifié avec les informations relatives à l’événement (chemin, …). Dans le cadre d’une application récupérant des fichiers de sources externes, il ne nous resterait qu’à lancer nos procédures de parsing XML ou de chargement en base.

Voici un aperçu de la même application avec une interface graphique WinForm :

Conclusion                                                                                                                                

FileSystemWatcher fait partie de ces classes qui passent inaperçu dans la documentation mais qui facilitent grandement la vie du développeur. Non seulement cet objet est optimisé par le Framework pour prendre le minimum de ressources machine, mais cet article vous a montré son étonnante facilité d'utilisation. Il ne vous reste plus qu'à vous lancer. Terminé avec le Polling via les Threads, vive l’utilisation des ressources Systèmes et du FileSystemWatcher !

 

 

Auteur : Sami Jaber

Copyright : DotNetGuru Ó 2002

Ressources

MSDN : http://msdn.microsoft.com/FileSystemWatcher 
 

Sources

Télécharger : Fichier Zip contenant la solution Visual Studio (RTM SP1)