Sur les systèmes Windows, il est possible de récupérer des évenements liés au système de fichier tel que la création d'un fichier, sa modification, sa suppression, ...
Le framework .Net fourni une classe, le FileSystemWatcher, qui permet de récupérer ces événements. Cette classe peut-être utilisée pour, par exemple, récupérer l'événement de modification d'un fichier de configuration afin de le recharger sans devoir redémarrer l'application concernée. Le FileSystemWatcher peut récupérer les évenements liés à un dossier et ses sous-dossiers ou un fichier déterminé.
Les principales propriétés définissant le watcher sont les suivantes :
- Filter (string) : Permet de filtrer les fichiers par extensions. Utilise les wildchars (exemple *.xml pour les fichiers avec l'extension xml). Si on specifie un nom de fichier les évenements ne seront déclenchés que pour ce fichier.
- IncludeSubdirectories (bool) : Permet d'inclure ou non les sous dossier du dossier défini dans la propriété Path
- NotifyFilter (enum NotifyFilters) : Permet de filtrer les évenements qui doivent déclencher le watcher.
- Path (string) : Le chemin du dossier sur lequel il faut écouter les évenements.
- EnableRaisingEvents (bool) : Démarre ou arrête le déclenchement des évenements par le watcher
- InternalBufferSize (int) : la taille du buffer contenant les évenements non encore traité. Une taille trop faible risque de provoquer de nombreux dépassements. La taille par défaut est de 8192.
Et les évenements écoutables sont :
- Changed : Un fichier ou un dossier a été modifé
- Created : Un fichier ou un dossier a été créé
- Deleted : Un fichier ou un dossier a été supprimé
- Renamed : Un fichier ou un dossier a été renommé
- Error : La limite du buffer du watcher a été dépassée
Voici un petit exemple permettant d'afficher dans une console si un fichier a été modifié :
Et voici le handler de l'évenement :
En fonction de l'éditeur que vous utilisez, il est possible que 2 évenements soient déclenchés lorsque vous sauvez votre fichier. Il existe plusieurs solutions permettant de résoudre ce problème (je vous invite à lire la source 3). Celle que je vous propose ici consiste à déterminer la date de dernière modification du fichier et de voir si le second évenement n'a pas été déclenché en même temps. Je stocke donc la date de dernière modification dans une variable et je la teste avant de réaliser la tâche à faire :
Ainsi, l'évenement ne sera déclenché qu'une seule fois.
La documentation de la MSDN (source 1) est, comme d'habitude, très explicite, n'hésitez donc pas à y jeter un oeil pour en savoir plus.
Sources :