2010-04-14 6 views
6

J'essaye d'écrire un programme qui pourrait surveiller plusieurs dossiers pour les créations de fichiers et lancer la même action mais avec des paramètres différents pour chaque dossier. Mon problème est en spécifiant un paramètre supplémentaire pour le FileSystemEventHandler. Je crée une nouvelle Filewatcher pour chaque répertoire pour surveiller et ajouter le gestionnaire pour l'action Créé:Paramètres supplémentaires pour FileSystemEventHandler

foreach (String config in configs) 
{ 
    ... 
    FileWatcher.Created += new System.IO.FileSystemEventHandler(FileSystemWatcherCreated) 
    ... 
} 

void FileSystemWatcherCreated(object sender, System.IO.FileSystemEventArgs e, MySettings mSettings) 
{ 
    DoSomething(e.FullPath, mSettings); 
} 

Comment pourrais-je obtenir la variable « mSettings » est passé à FileSystemWatcherCreated()?

+0

D'où vient 'mSettings' se préparent? – James

+0

Désolé pour le mauvais exemple. mSettings est défini dans le premier ... à partir de la configuration actuelle mais je pensais que ce n'était pas vraiment pertinent à la question. – peku

Répondre

3
foreach (String config in configs) 
{ 
    ... 
    FileWatcher.Created += (s,e) => DoSomething(e.FullPath, mSettings); 
    ... 
} 
+0

Comment vous désinscrire de l'événement? Que faire si le premier ... se développe en mSettings.MyProperty = config? – Henrik

+2

Oui merci! Fonctionne exactement comme je le voulais. Je savais qu'il devait y avoir un moyen simple d'y parvenir. – peku

+1

+1 Ancien poste, mais trouvé google'ing et m'a aidé, aussi – YvesR

0

Vous ne pouvez pas demander plus d'informations que ce que le gestionnaire FileWatcher fournit. Ce que vous pouvez faire est cependant de créer une petite classe qui ont accès à la configuration et ont également un délégué que vous pouvez joindre à l'événement de CreatedFileWatcher

class Program 
{ 
    static void Main(string[] args) 
    { 
     FileSystemWatcher watcher = new FileSystemWatcher("yourpath"); 

     var configurations = new IConfiguration[] 
           { 
            new IntConfiguration(20), 
            new StringConfiguration("Something to print") 
           }; 

     foreach(var config in configurations) 
      watcher.Created += config.HandleCreation; 
    } 

    private interface IConfiguration 
    { 
     void HandleCreation(object sender, FileSystemEventArgs e); 
    } 

    private class IntConfiguration : IConfiguration 
    { 
     public IntConfiguration(int aSetting) 
     { 
      ASetting = aSetting; 
     } 

     private int ASetting { get; set; } 

     public void HandleCreation(object sender, FileSystemEventArgs e) 
     { 
      Console.WriteLine("Consume your settings: {0}", ASetting); 
     } 
    } 

    public class StringConfiguration : IConfiguration 
    { 
     public string AnotherSetting { get; set;} 

     public StringConfiguration(string anotherSetting) 
     { 
      AnotherSetting = anotherSetting; 
     } 

     public void HandleCreation(object sender, FileSystemEventArgs e) 
     { 
      Console.WriteLine("Consume your string setting: {0}", AnotherSetting); 
     } 
    } 
} 
+1

C'est exactement pourquoi vous devriez utiliser des fermetures, et ne pas écrire tout ce code supplémentaire inutile. – leppie

0

Vous devez comprendre ce que vous utilisez. définition de FileSystemEventHandler est-

public delegate void FileSystemEventHandler(object sender, FileSystemEventArgs e);

Vous ne pouvez pas passer le troisième argument. Afin de passer les "réglages" de données, vous devrez peut-être écrire votre propre code supplémentaire, j'ai peur.

5

foreach (String config in configs) 
{ 
    ... 
    MySettings mSettings = new MySettings(...); // create a new instance, don't modify an existing one 
    var handler = new System.IO.FileSystemEventHandler((s,e) => FileSystemWatcherCreated(s,e,msettings)); 
    FileWatcher.Created += handler; 
    // store handler somewhere, so you can later unsubscribe 
    ... 
} 

void FileSystemWatcherCreated(object sender, System.IO.FileSystemEventArgs e, MySettings mSettings) 
{ 
    DoSomething(e.FullPath, mSettings); 
} 
+0

Merci pour cela aussi, semble être une version plus "complète" de la réponse que j'ai acceptée, mais puisque je n'aurai pas besoin de se désabonner pense que je vais rester avec l'approche la plus simple. +1 – peku

Questions connexes