2010-10-19 26 views
2

Ok, j'ai donc appris de How to check if a open file has been updated que je devrais utiliser un FileSystemWatcher pour surveiller les modifications apportées aux fichiers. Alors maintenant, la question est de savoir si je dois garder la trace de nombreux fichiers, puis-je créer 1 observateur pour chaque fichier? De plus, je dois en quelque sorte disposer de l'observateur une fois le fichier fermé. Avoir un Dictionary<string, FileSystemWatcher> stocker le chemin de fichier et le FileSystemWatcher le chemin à parcourir? à mesure que j'ouvre plus de fichiers, j'ajoute plus d'observateur et, au fur et à mesure que je ferme, je dispose des observateurs de manière appropriée. Est-ce que le fait d'avoir trop de spectateurs sera une mauvaise chose?C#: Utilisation de FileSystemWatcher pour surveiller les modifications apportées aux fichiers

MISE À JOUR

Je viens de

protected void AttachFileMonitor(EditorTabViewModel tab) 
{ 
    string file = tab.FilePath; 
    if (!_fsWatchers.ContainsKey(file)) 
    { 
     var watcher = new FileSystemWatcher(); 
     watcher.Path = Path.GetDirectoryName(file); 
     watcher.Filter = Path.GetFileName(file); 
     watcher.Changed += (s, e) => 
     { 
      string message = ""; 
      string caption = ""; 
      MessageBoxButton buttons = MessageBoxButton.YesNo; 
      MessageBoxImage image = MessageBoxImage.Question; 
      MessageBoxResult defaultResult = MessageBoxResult.Yes; 
      MessageBoxResult result = _dialogSvc.GetMessageBox(message, caption, buttons, image, defaultResult); 
      if (result == MessageBoxResult.Yes) 
      { 
       tab.Open(file); 
      } 
     }; 
     _fsWatchers.Add(file, watcher); 
    } 
} 
protected void DetachFileMonitor(EditorTabViewModel tab) 
{ 
    if (_fsWatchers.ContainsKey(tab.FilePath)) { 
     _fsWatchers.Remove(tab.FilePath); 
    } 
} 

J'ai trouvé que Changed() ne se déclenche ...

+0

Définir EnableRaisingEvents sur true :) – Onkelborg

Répondre

2

Il suffit si vous créez un guetteur pour chaque répertoire (et le cas échéant, vous peut avoir l'observateur pour surveiller toute une arborescence de répertoires.) Vous pouvez ensuite utiliser les événements pour comparer les fichiers modifiés avec la liste des fichiers qui vous intéressent.

Je vous suggère de faire une sorte de classe "nounou" pour les observateurs pour vous assurer de ne pas disposer d'observateurs actifs, ou de créer des doublons. Juste un conseil :)

Btw, oui, il y a une limite, vous ne pouvez pas créer des observateurs infinis. Dans des scénarios spécifiques qui peuvent être un problème, mais le plus probable, ce n'est pas le cas pour vous.

+0

Je me demande si je fais quelque chose de mal? 'FileSystemWatcher' semble ne pas fonctionner pour moi. ou est-ce la raison pour laquelle tant de gens mettent en garde contre son utilisation? –

+0

Je suppose, mais avez-vous défini EnableRaisingEvents à true? – Onkelborg

+0

Cela a fonctionné, mais changé est levé 2 fois même lorsque je sauvegarde de mon application. J'ai lu que cela pourrait arriver mais comment puis-je vérifier si l'événement a déjà été soulevé b4? –

1

Je pense que vous êtes définitivement sur la bonne voie. C'est à vous de décider comment stocker les multiples filewatchers, mais il est important de les éliminer et d'effacer leur file d'attente le plus rapidement possible. Vous n'en avez besoin que d'un par répertoire, pas de fichier.

Il existe de nombreux articles sur le manque de fiabilité de fileWatchers, alors soyez vigilant dans votre utilisation.

+0

Je me demande si je fais quelque chose de mal? 'FileSystemWatcher' semble ne pas fonctionner pour moi. ou est-ce la raison pour laquelle tant de gens mettent en garde contre son utilisation? –

0

C'est vraiment un compromis. De nombreux observateurs consommeront plus de ressources, mais si vous avez un observateur sur un répertoire contenant beaucoup de fichiers/sous-répertoires (par exemple C :), cela consommera également beaucoup de ressources.

Si tous les fichiers se trouvent dans un seul dossier, vous devez simplement utiliser l'observateur unique.

+0

Il y a encore une chose à considérer: un observateur va consommer des ressources, oui, mais il ne sera pas interrogé, et l'interrogation est dans la plupart des cas mauvaise. Il vaut mieux être inactif et attendre quelque chose plutôt que de demander activement quelque chose. En termes de performance et de réactivité, il est clairement préférable d'attendre au lieu de demander. – Onkelborg

+0

Non, il ne sera pas interrogé. Cependant, il recevra toutes les modifications dans la structure de dossiers que vous avez spécifiée. Spécifiquement lorsque vous spécifiez C: \, vous serez averti de toute activité sur votre lecteur C: \, et ce sera beaucoup. –

+0

Oui, je sais qu'il ne sera pas interroger, je parlais de l'alternative à l'utilisation d'un FileSystemWatcher: interrogation;) Mais si vous specfiy C: \ il n'y aura pas beaucoup d'activité, sauf si vous activez le mode récursif. Le point que j'essayais de faire est qu'il est probable que le sondage utilise plus de ressources qu'un observateur. – Onkelborg