FileSystemWatcher appel mutilple de Changed

Résolu
keikun59 Messages postés 73 Date d'inscription mardi 15 mars 2005 Statut Membre Dernière intervention 18 novembre 2010 - 29 avril 2006 à 15:02
keikun59 Messages postés 73 Date d'inscription mardi 15 mars 2005 Statut Membre Dernière intervention 18 novembre 2010 - 8 mai 2006 à 23:42
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

cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
1 mai 2006 à 22:17
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
3
keikun59 Messages postés 73 Date d'inscription mardi 15 mars 2005 Statut Membre Dernière intervention 18 novembre 2010 1
8 mai 2006 à 22:51
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
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
8 mai 2006 à 23:05
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
0
keikun59 Messages postés 73 Date d'inscription mardi 15 mars 2005 Statut Membre Dernière intervention 18 novembre 2010 1
8 mai 2006 à 23:20
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
8 mai 2006 à 23: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 !
0
keikun59 Messages postés 73 Date d'inscription mardi 15 mars 2005 Statut Membre Dernière intervention 18 novembre 2010 1
8 mai 2006 à 23:42
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
0
Rejoignez-nous