Dans le cadre de Nova, j’ai du utiliser le FileSystemWatcher pour tracer les modifications sur un fichier donné. Jusque là tout va bien me direz vous.
Toutefois, j’ai eu un comportement bien étrange : chaque fois que je modifiais le fichier surveillé je recevais deux événements Changed de la part du watcher.
Tel un docteur House de l’informatique, je me suis donc livré à un raisonnement différentiel (mon dieu que je me la pète).
Voici donc les symptômes:
- Le double événement est systématique
- Il peut parfois y en avoir trois
- Si le NotifyFilter est sur Name ou Size, le problème disparait
- Aucun bug ne semble connu sur le sujet
- Si le fichier n’est pas sur mon bureau mais dans un répertoire d’un disque annexe, le problème disparait
A partir de cela j’ai finalement trouvé le coupable : Windows! En effet lors de la modification de mon fichier, Windows lance ce cher indexeur et ajoute donc une notification. Si en plus j’ai un anti-virus actif c’est coup triple.
C’est le fait que sur un disque annexe je n’ai pas le problème qui m’a mit la puce à l’oreille. En effet, Windows est configuré pour n’indexer que mon profil et pas des répertoires extérieurs.
Connaissant le coupable, le traitement est relativement simple. Je me suis fait une petite variable de type DateTime qui stocke la date de dernière modification de mon fichier. Si cette valeur est égale à la LastAccessTime de mon fichier je ne fais rien sinon je lance mon code:
DateTime previous = lastAccessedDates[sender as FileSystemWatcher];
FileInfo fileInfo = new FileInfo(e.FullPath);
if (fileInfo.LastAccessTime > previous)
{
lastAccessedDates[sender as FileSystemWatcher] = fileInfo.LastAccessTime;
// Code de traitement
}
Windows Forms, .Net