DMI's Blog sur les technos .NET(dotnet) et J2EE

FileSystemWatcher

FileSystemWatcher

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 Main(string[] args)

{

// 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);

}

 

}

}

 

 

aucun commentaire - aucun rétrolien