salut,
comportement bizarre de VS2008 ...
je viens de finir ma petite application qui doit sauvegarder toutes les modifications des fichiers d'un répertoire.
son fonctionnement est simple, un FileSystemWatcher est lancé sur le répertoire a surveiller, si un fichier est modifié alors une copie de ce fichier est placé dans un répertoire de destination avec un N° de version pour garder tout l'historique des modifications.
il y a tout un paquet d'options pour filtrer les fichiers qui doivent être sauvegardés : extensions, nom, ... etc
pour l'instant j'ai 2 répertoires a surveiller :
1-le répertoire htdocs de Apache ... dedans on trouve tous les fichiers WEB (PHP/HTML/JS/CSS/AS + projets Flex + haxe + ...)
2-le répertoire projets de VS2008
les fichiers du répertoire N°1 sont modifiés/édités avec Editplus (mon éditeur de texte), tout fonctionne parfaitement.
j'ai aussi testé la sauvegarde avec Flex, dreamweaver, notepad ... etc, tout est nickel, le comportement est exactement celui espéré.
les fichiers du répertoire N°2 sont modifiés/édités avec VS2008 et la ca merdouille ... a aucun moment le programme n'est capable de détecter un changement dans les fichiers *.cs *.resx ... de l'ouverture de VS a sa fermeture
a la place je détecte des changements dans des fichiers xxxxx.tmp qui n'existent pas (vérifié avec FileInfo.Exists()) et c'est tout
voici un log de l'appli quand je sauvegarde le fichier test_thread4\form1.cs avec VS2008 (il n'y a qu'une seule sauvegarde qui déclenche ces 7 évènements, mais ceci est encore une autre histoire)
si j'ouvre le fichier test_thread4\form1.cs avec un éditeur de texte juste aprés sa sauvegarde avec VS2008, je vois bien les modifications apportées ... alors pourquoi le FileSystemWatcher est il incapable de détecter le moindre changement sur ce fichier ?Declenchement : (vendredi 03 octobre 2008 18:19:54.0156) Projets VS2008 a surveiller
C:\Documents and Settings\lolo\Mes documents\Visual Studio 2008\Projects\test_thread4\ve-2BE3.tmp
Changed
Refus : (vendredi 03 octobre 2008 18:19:54.0312) Projets VS2008 a surveiller
C:\Documents and Settings\lolo\Mes documents\Visual Studio 2008\Projects\test_thread4\ve-2BE3.tmp
Le fichier n'existe pas !??
Declenchement : (vendredi 03 octobre 2008 18:19:54.0312) Projets VS2008 a surveiller
C:\Documents and Settings\lolo\Mes documents\Visual Studio 2008\Projects\test_thread4\ve-2BE3.tmp
Changed
Refus : (vendredi 03 octobre 2008 18:19:54.0312) Projets VS2008 a surveiller
C:\Documents and Settings\lolo\Mes documents\Visual Studio 2008\Projects\test_thread4\ve-2BE3.tmp
Temps trop court !
Declenchement : (vendredi 03 octobre 2008 18:19:54.0312) Projets VS2008 a surveiller
C:\Documents and Settings\lolo\Mes documents\Visual Studio 2008\Projects\test_thread4\ve-2BE3.tmp
Changed
Refus : (vendredi 03 octobre 2008 18:19:54.0312) Projets VS2008 a surveiller
C:\Documents and Settings\lolo\Mes documents\Visual Studio 2008\Projects\test_thread4\ve-2BE3.tmp
Temps trop court !
Declenchement : (vendredi 03 octobre 2008 18:19:54.0312) Projets VS2008 a surveiller
C:\Documents and Settings\lolo\Mes documents\Visual Studio 2008\Projects\test_thread4
Changed
Refus : (vendredi 03 octobre 2008 18:19:54.0312) Projets VS2008 a surveiller
C:\Documents and Settings\lolo\Mes documents\Visual Studio 2008\Projects\test_thread4
Le fichier n'existe pas !??
Declenchement : (vendredi 03 octobre 2008 18:19:54.0312) Projets VS2008 a surveiller
C:\Documents and Settings\lolo\Mes documents\Visual Studio 2008\Projects\test_thread4\Form1.cs~RF38e59406.TMP
Changed
Refus : (vendredi 03 octobre 2008 18:19:54.0468) Projets VS2008 a surveiller
C:\Documents and Settings\lolo\Mes documents\Visual Studio 2008\Projects\test_thread4\Form1.cs~RF38e59406.TMP
Le fichier n'existe pas !??
Declenchement : (vendredi 03 octobre 2008 18:19:54.0468) Projets VS2008 a surveiller
C:\Documents and Settings\lolo\Mes documents\Visual Studio 2008\Projects\test_thread4
Changed
Refus : (vendredi 03 octobre 2008 18:19:54.0468) Projets VS2008 a surveiller
C:\Documents and Settings\lolo\Mes documents\Visual Studio 2008\Projects\test_thread4
Temps trop court !
Declenchement : (vendredi 03 octobre 2008 18:19:54.0468) Projets VS2008 a surveiller
C:\Documents and Settings\lolo\Mes documents\Visual Studio 2008\Projects\test_thread4
Changed
Refus : (vendredi 03 octobre 2008 18:19:54.0468) Projets VS2008 a surveiller
C:\Documents and Settings\lolo\Mes documents\Visual Studio 2008\Projects\test_thread4
Temps trop court !
et pourquoi un tel comportement de VS2008 ?
je me prend la tète avec ce problème depuis un paquet de jours maintenant ... si vous avez des idées pour corriger ce probleme/comportement, je suis preneur.
merci.
la déclaration du FileSystemWatcher :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 _fileSystemWatcher = new FileSystemWatcher(); _fileSystemWatcher.Path = _repertoireRacineSurveillance; _fileSystemWatcher.IncludeSubdirectories = inclureSousRepertoires; _fileSystemWatcher.NotifyFilter = NotifyFilters.LastWrite; try { _fileSystemWatcher.Filter = filtre; } catch( Exception exFiltre ) { throw new Exception("La valeur de l'argument 'filtre' n'est pas valable" + Environment.NewLine + exFiltre.Message, exFiltre.InnerException); } _fileSystemWatcher.Changed += new System.IO.FileSystemEventHandler(this.evtFileSystemWatcherChanged);
l'evenement du FileSystemWatcher :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 private void evtFileSystemWatcherChanged(object sender, System.IO.FileSystemEventArgs e) { if( Declenchement != null ) { Declenchement(this, new SurveillanceEventArgs(e.FullPath, e.ChangeType.ToString())); } // TEST INTERVAL TEMPS if( accesFichier.ContainsKey(e.FullPath) == false ) { accesFichier.Add(e.FullPath, DateTime.Now.Ticks); } else { if( DateTime.Now.Ticks - accesFichier[e.FullPath] < 3000000 ) {// 3/10eme de seconde accesFichier[e.FullPath] = DateTime.Now.Ticks; if( RaisonRefus != null ) { RaisonRefus(this, new SurveillanceEventArgs(e.FullPath, "Temps trop court !")); } return; } accesFichier[e.FullPath] = DateTime.Now.Ticks; } // VERIFIER PRÉSENCE .... FileInfo fi = new FileInfo(e.FullPath); if( fi.Exists == false ) { if( RaisonRefus != null ) { RaisonRefus(this, new SurveillanceEventArgs(fi.FullName, "Le fichier n'existe pas !")); } return; } // VERIFIER EXTENSIONS string ext = fi.Extension.ToLower(CultureInfo.CurrentCulture); if( (_extensions.IndexOf(ext) == -1) && _extensions.IndexOf(".*") == -1 ) { if( RaisonRefus != null ) { RaisonRefus(this, new SurveillanceEventArgs(fi.FullName, "L'extension du fichier n'est pas dans la liste.")); } return; } // FichierVersion.sauverVersion() FichierVersion fichier = new FichierVersion(); fichier.Sauvegarde += new EventHandler<SurveillanceEventArgs>(fichier_Sauvegarde); fichier.RaisonRefus += new EventHandler<SurveillanceEventArgs>(fichier_RaisonRefus); fichier.fichierSource = e.FullPath; fichier.repertoireRacineSurveillance = this._repertoireRacineSurveillance; fichier.repertoireRacineSauvegarde = this._repertoireRacineSauvegarde; fichier.sauverVersion(); }
Partager