FileSystemWatcher appel mutilple de Changed [Résolu]

Signaler
Messages postés
73
Date d'inscription
mardi 15 mars 2005
Statut
Membre
Dernière intervention
18 novembre 2010
-
Messages postés
73
Date d'inscription
mardi 15 mars 2005
Statut
Membre
Dernière intervention
18 novembre 2010
-
Bonjour,

Je faisais joujou avec .net et je me suis dis, je vais tester la surveillance de fichiers/dossiers.
J'utilise la class FileSystemWatcher, avec celle-ci je regarde surveille les fichiers dans un dossier.
Quand le fichier est modifié, un événement appel la méthode copie(...). Ce que je ne comprend pas est pourquoi celle-ci est appelé 3 fois de suite avec que je n'enregistre les modification qu'une seule fois (j'utilise le notepad pour modifier le fichier surveillé)

voici un bou du code

private
FileSystemWatcher fileSystemWatcher;

private
StreamWriter streamWriter;

private
void MyFileWatcher_Load(
object sender,
EventArgs e)

{

streamWriter = new
StreamWriter(
@"F:\Tmp\sav\log.txt");

streamWriter.AutoFlush = true;

fileSystemWatcher = new
FileSystemWatcher();

fileSystemWatcher.Path = @"F:\Tmp\z";

fileSystemWatcher.Filter = "*.xml";

fileSystemWatcher.NotifyFilter = NotifyFilters.LastAccess |
NotifyFilters.LastWrite |
NotifyFilters.FileName |
NotifyFilters.DirectoryName |
NotifyFilters.Size;

fileSystemWatcher.WaitForChanged(WatcherChangeTypes.All, 2000);

fileSystemWatcher.Changed += new
FileSystemEventHandler(copie);

fileSystemWatcher.Created += new
FileSystemEventHandler(copie);

fileSystemWatcher.Deleted += new
FileSystemEventHandler(copie);

fileSystemWatcher.EnableRaisingEvents = true;

}

private
void copie(
object sender,
FileSystemEventArgs e)

{

try

{

if (!
File.Exists(
@"F:\Tmp\sav" +
DateTime.Now.Ticks.ToString() +
"-" + e.Name)){

if (e.ChangeType !=
WatcherChangeTypes.Deleted){

string nomFichier =
@"F:\Tmp\sav" +
DateTime.Now.Ticks.ToString() +
"-" + e.Name;

File.Copy(e.FullPath, nomFichier);}

streamWriter.WriteLine(

DateTime.Now.ToLongDateString() +
" " +
DateTime.Now.ToLongTimeString() +
";" + e.Name +
";" + e.ChangeType);}

else{

streamWriter.WriteLine(

DateTime.Now.ToLongDateString() +
" " +
DateTime.Now.ToLongTimeString() +
";Fichier existant"); }

}

catch (
Exception ex){

streamWriter.WriteLine(

DateTime.Now.ToLongDateString() +
" " +
DateTime.Now.ToLongTimeString() +
";Erreur," + ex.Message);}

}

private
void MyFileWatcher_FormClosing(
object sender,
FormClosingEventArgs e){

streamWriter.Close();

}

}

}

<hr>
Keikun59
http://blogs.developpeur.org/keikun59

6 réponses

Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
Salut,
J'ai eu ce problème et je l'ai résolu en arrêtant la surveillance et en la redémarrant une fois le 1er déclenchement de l'event changed ou renamed peut importe.

Essais en rajoutant à la fin de ta méthode copie ceci:
fileSystemWatcher.EnableRaisingEvents = false
System.Threading.Thread.Sleep(500)
fileSystemWatcher.EnableRaisingEvents = true
Messages postés
73
Date d'inscription
mardi 15 mars 2005
Statut
Membre
Dernière intervention
18 novembre 2010
1
Bonjour,

Tout d'abord merci pour ta réponse. Mais le but du programme est de surveiller et si je mets en pause la surveillance, cela perd de son intérêt car je peux louper un événement.

Merci quand même.


<HR>
Keikun59
http://blogs.developpeur.org/keikun59
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
Je ne vois pas en quoi tu va louper quelques choses....
J'ai mis un sleep entre l'arret et le démarrage de l'instance mais ce n'est pas obligatoire...tu auras le meme résultat sans
Messages postés
73
Date d'inscription
mardi 15 mars 2005
Statut
Membre
Dernière intervention
18 novembre 2010
1
fileSystemWatcher.EnableRaisingEvents = false
fileSystemWatcher.EnableRaisingEvents = true


Entre le moment où EnableRaisingEvents passe à false puis à true, la surveillance est à l'arrêt.
Donc si un fichier est modifié, supprimé, créé, l'événement ne va pas s'éxécuter donc je peux pendant ce court instant louper un événement.


<HR>
Keikun59
http://blogs.developpeur.org/keikun59
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
Attend sa prend 3 milli entre l'arret et le démarrage.....tu vas pas me dire que tu vas louper des événements en 3 milli !
Messages postés
73
Date d'inscription
mardi 15 mars 2005
Statut
Membre
Dernière intervention
18 novembre 2010
1
Tout à fait, mais, je prend le cas extrem, si on te demande de développer une application qui ne te permet pas de louper un événement. Je vais utiliser ta technique dans mon cas mais je me pose des questions sur le vrai sens de se comportement du framework.

Je vais sortir reflector :)


<HR>
Keikun59
http://blogs.developpeur.org/keikun59