2009-04-29 9 views
1

Je travaille sur un service Windows qui surveille quelques dossiers pour les changements, les créations et les suppressions. Tout fonctionne bien à l'exception d'un observateur qui regarde un seul fichier (fichier XML avec paramètres de configuration) pour les changements mineurs.FileSystemWatcher Evénement modifié non déclenché

J'ai essayé de prendre le code du service Windows et de le placer dans une application Windows simple avec des boutons de démarrage/arrêt pour les observateurs du système de fichiers et je l'ai parcouru. Il ne détecte jamais le changement de fichier du fichier de configuration XML. Les modifications sont en effet survenues et la "Date de modification" du fichier est mise à jour.

XmlEventReferences = New System.IO.FileSystemWatcher() 
XmlEventReferences.Path = "C:\XmlReferences\" 
XmlEventReferences.Filter = "*.xml" 
XmlEventReferences.NotifyFilter = IO.NotifyFilters.FileName 
AddHandler XmlEventReferences.Changed, AddressOf ReloadEventReferences 
AddHandler XmlEventReferences.Created, AddressOf ReloadEventReferences 
AddHandler XmlEventReferences., AddressOf ReloadEventReferences 
XmlEventReferences.EnableRaisingEvents = True 

C'était une partie du code, ce qui est un échantillon du fichier XML:

<EventReference> 
    <ER_EL_NUMBER>1</ER_EL_NUMBER> 
    <ER_SEND_TO_DATABASE>true</ER_SEND_TO_DATABASE> 
    <ER_ACTIVATE_ALARM>true</ER_ACTIVATE_ALARM> 
    <ER_DESCRIPTION /> 
</EventReference> 

Répondre

11

Je crois que le problème est la valeur de NotifyFilter. Vous avez seulement dit au FileSystemWatcher de rechercher les changements de nom de fichier. Pour qu'il déclenche également l'événement Changed pour les modifications de fichier, vous devez également spécifier l'indicateur LastWrite.

à savoir la ligne de code ne correspond le être changé à:

XmlEventReferences.NotifyFilter = IO.NotifyFilters.FileName | 
    IO.NotifyFilters.LastWrite; 

Voir la page NotifyFilters sur MSDN pour plus d'informations. Remarque: Comme l'indique Joshua Belden, vous n'avez même pas besoin de définir la propriété NotifyFilter car MSDN indique: "La valeur par défaut est la combinaison OR de LastWrite, FileName et DirectoryName." Cependant, je dirais qu'il est toujours préférable d'être explicite dans de tels cas - il rend alors parfaitement évident ce que le FileSystemWatcher est et est pas regarder.

+0

Merci! J'apprécie l'aide – Paxenos

1

Vous devez changer votre .NotifyFilter à quelque chose comme LastWrite pour ramasser les changements que je crois.

lien MSDN here

0

Ce code semblait fonctionner pour moi, ramassé une modification à un fichier test.xml.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Dim XmlEventReferences = New System.IO.FileSystemWatcher() 
    XmlEventReferences.Path = "C:\" 
    XmlEventReferences.Filter = "*.xml" 
    XmlEventReferences.EnableRaisingEvents = True 
    AddHandler XmlEventReferences.Changed, AddressOf Watch 
End Sub 

Private Sub Watch(ByVal sender As Object, ByVal e As FileSystemEventArgs) 
    Dim s As String = e.FullPath 
End Sub 

Videz le filtre de notification tous ensemble.

+0

De MSDN (http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.notifyfilter.aspx): "La valeur par défaut est la combinaison OR de LastWrite, FileName et DirectoryName " Donc oui, vous n'avez pas besoin de la ligne spécifiant NotifyFilter, mais cela ne fait pas de mal d'être explicite sur ce que vous regardez. (Je l'incluerais de toute façon pour cette raison.) – Noldorin

Questions connexes