Vendredi 31 Mars 2006
FileSystemWatcher
Par dotnet, Vendredi 31 Mars 2006 à 15:04 GMT+2 dans Astuces du Mois
Une petite histoire
Un jour mon boss entre dans mon bureau et me demande si c’est facile de faire communiquer deux applications GRC distantes (Gestion de la Relation Client) développées sous .NET sachant qu’on n’avait pas la main sur l’une d’elles. J’ai répondu qu’il suffit de passer par .NET Remoting (trop lourd) ou utiliser un WebService (inadapté) car on n’avait besoin que d’une méthode (celle qui retourne les infos concernant le nouveau client). Mauvaise réponse !
L’idée :
La première application avais pour rôle de créer de nouveaux clients et d’effectuer un minimum de vérifications (adresse postale, mail, âge, …) et la seconde devait récupérer ces informations pour géocoder les adresses postales afin de les placer sur une carte.
Le principe:
Le principe serait d’avoir un répertoire commun aux deux applications dans lequel l’application 1 pourra déposer la description du nouveau client et l’application 2 devra vérifier à intervalle régulier si un nouveau client a été créé.
L’architecture :
Les deux applications appartenant au même réseau local (et domaine) nous avons créé un répertoire partagé nommé Spy contenant un fichier nommée Customers.xml.
L’application 1 devait créer un client puis le rajouté dans le fichier xml et l’application 2 vérifier à intervalle régulier si le fichier avait été modifié pour le lire.
Cette technique est très utilisée dans les applications EAI pour faire communiquer plusieurs applications hétérogènes.
La solution :
Après un peu de recherche sur le web j’ai vu que je n’avais pas à développer des containers ni de connecteurs comme dans les EAI puisque .NET offre une classe très particulière et peu utilisé qui permet de le faire : FileSystemWatcher.
Pour le faire :
- Créer une application Windows console
- Ajouter ceci :
using System;
using System.IO;
namespace ConsoleApplicationTests
{
/// <summary>
/// Description résumée de Class1.
/// </summary>
class
Class1
{
/// <summary>
/// Point d'entrée
principal de l'application.
/// </summary>
[STAThread]
static void
{
// Création de l’objet FileSystemWatcher
FileSystemWatcher
MyWatcher = new FileSystemWatcher();
// Répertoire à surveiller
\\par-madiop\Spy
MyWatcher.Path =
@"\\MaMachine\Spy";
// Ne pas surveiller les répertoires
fils
MyWatcher.IncludeSubdirectories = false;
// Filtre pour les notifications
MyWatcher.NotifyFilter = NotifyFilters.LastAccess |
NotifyFilters.LastWrite
|
NotifyFilters.FileName
|
NotifyFilters.DirectoryName;
// Superviser uniquement le fichier Customers.xml
MyWatcher.Filter
= "Customers.xml";
//En cas de changement de
Customer.xml -> appeler la méthode OnChange
MyWatcher.Changed += new FileSystemEventHandler(OnChanged);
//En cas de création de Customer.xml
-> appeler la méthode OnChange
MyWatcher.Created += new FileSystemEventHandler(OnChanged);
// Permettre le composant de
commencer à superviser nles changements
MyWatcher.EnableRaisingEvents = true;
//Maintenir la console afficher pour voir défiler les
changements
Console.WriteLine("Press \'q\' to
quit.");
while(Console.Read()!='q');
}
public static void OnChanged(object source, FileSystemEventArgs
e)
{
Console.WriteLine("{0}
: Changed", System.DateTime.Now);
}
}
}





