Bonjour,
J'ai un phénomène bizarre avec une fonction récursive chargée de lister tous les fichiers images .jpg. A ses débuts elle donnait satisfaction mais depuis l'arborescence à pris du ventre, j'ai environ 8000 images à lister et j'ai constaté que le nombre d'images trouvées par cette fonction n'était plus jamais le même.
J'utilise FPC 2.7.1 svn et Lazarus 1.1 svn et synapse svn 184 ( mais j'ai des problèmes similaires avec indy )
Il y-a un truc aléatoire qui fait que le changement de répertoire échoue parfois de manière tout à fait aléatoire. Seul if not ... permet de les détecter, elles ne provoquent aucune exception. Mais lors-quelles surviennent la fonction getcurrentdir au lieu de me renvoyer un honorable nom de répertoire renvoie:
"250 CWD command successful" ou beaucoup plus rarement "229 transfert complete"
Un second appel de getcurrentdir sitôt après renverra bien un répertoire.
Ca ne vient pas d'une interruption de transfert, le graphe de connexion est parfaitement régulier du début à la fin.
Je joins ci-dessous la fonction concernée et un aperçu des erreurs ( Il s'en produit entre 1 et 5 par usage de la fonction ). Le "229 transfert complete" je ne l'ai eu q'une fois sur le point 0 ( Tout en haut ) sur plusieurs dizaines d'essais.
Je n'arrive pas à comprendre ce qui se passe.
La fonction ( Temps d'exécution env. 7 Mins pour env. 8000 fichiers, taux de transfert 3 Ko/s Up 12/6 Kos Down.)
Les erreurs ( Tous les résultats mentionnés en face de 'a trouvé' et 'est dans' sont fournis par getcurrentdir.)
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 procedure TFBouq_Select_01.Get_Liste_Images_Ftp ( Ftp:TFTPSend; Start_Dir:String ); var i:integer; Restart_Dir, Curr_file:String; LFoldersToExplore:TSTringList; IsConnect:Boolean; function Restore_Full_Path(const cPath : string) : string; begin // Recomposer le chemin complet d'un répertoire. if Length(cPath)>1 then begin if cPath[Length(cPath)] <> '/' then Result := cPath + '/' else Result := cPath; end else Result := '/'; end; begin with FTP do begin try if not ChangeWorkingDir(Start_Dir) then Memo_Ftp.Lines.Add('Echec 0 de: '+GetCurrentDir+' vers: '+Start_Dir); try List(Start_Dir, False); //Lister le répertoire en cours. finally NoOp; // Time out ? end; except on E:Exception do begin showmessage(E.Message); Logout; exit; end; end; LFoldersToExplore := TStringList.Create; try for i:= 0 to FtpList.Count-1 do begin if not (FtpList.Items[i].Directory )then begin // Si ce n'est pas un répertoire lister les fichiers. Curr_File:=Restore_Full_Path(Start_Dir)+FtpList.Items[i].FileName; // Full path name fichier sur le FTP. If extractFileext(Curr_File)='.jpg' then begin // Ne conserver que les images jpg. Memo_Ftp.Lines.Add(Curr_file); // Pour info visuelle. end; end else // Répertoire, l' ajouter à la liste à traiter. if (FtpList.Items[i].FileName<>'.') and (FtpList.Items[i].FileName<>'..') then begin LFoldersToExplore.Add(Restore_Full_Path(Start_Dir)+FtpList.Items[i].FileName); Memo_Ftp.Lines.add('Est dans 1: '+GetCurrentDir); Memo_Ftp.Lines.add('Veut trouver 1: '+Restore_Full_Path(Start_Dir)+FtpList.Items[i].FileName); if not ChangeWorkingDir(Restore_Full_Path(Start_Dir)+FtpList.Items[i].FileName) then Memo_Ftp.Lines.Add('Echec 1 de : '+GetCurrentDir+' vers: '+Restore_Full_Path(Start_Dir)+FtpList.Items[i].FileName); Memo_Ftp.Lines.add('A trouvé 1: '+GetCurrentDir); end; end; // Fin de for i:= 0 to FtpList.Items.Count-1 for i:=0 to LFoldersToExplore.Count-1 do begin // Exploration des dossiers. Get_Liste_Images_Ftp(ftp, LFoldersToExplore[i] ); Memo_Ftp.Lines.add('Est dans 2: '+GetCurrentDir); Memo_Ftp.Lines.add('Veut trouver 2: '+Start_Dir); if not ChangeWorkingDir(Start_Dir) then Memo_Ftp.Lines.Add('Echec 2 de : '+GetCurrentDir+' ver: '+Start_Dir); Memo_Ftp.Lines.add('A trouvé 2: '+GetCurrentDir); end; finally LFoldersToExplore.Free; {Libérer la liste} end; end; Application.ProcessMessages; end;
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
48
49
50
51
52
53
54 ---- Cas 1 listage des répertoires ---- Est dans 1: /vues/journaux/g_civil Veut trouver 1: /vues/journaux/g_trotter ----- Ne trouve pas le répertoire, getcurrentdir renvoie une valeur fantaisiste ----- Echec 1 de : 250 CWD command successful vers: /vues/journaux/g_trotter ----- Mais le getcurrentdir qui suit aussitôt est correct ----- A trouvé 1: /vues/journaux/g_trotter Est dans 1: /vues/journaux/g_trotter Veut trouver 1: /vues/journaux/histoire A trouvé 1: 250 CWD command successful Est dans 1: /vues/journaux/histoire Veut trouver 1: /vues/journaux/illustr A trouvé 1: 250 CWD command successful Est dans 1: /vues/journaux/illustr Veut trouver 1: /vues/journaux/jeun_cine A trouvé 1: 250 CWD command successful -------- Etc ... Ici l''erreur est sans conséquence ----- ---- Mais ici même erreur au même endroit et le répertoire /vues/papier/factures/50_99 sera ignoré par la suite --- Veut trouver 1: /vues/papier/factures/chatelet_75 Echec 1 de : 250 CWD command successful vers: /vues/papier/factures/chatelet_75 A trouvé 1: /vues/papier/factures/chatelet_75 Est dans 2: /vues/papier/factures/50_99 Veut trouver 2: /vues/papier/factures A trouvé 2: /vues/papier/factures ------ Cas 2 listage des fichiers d''un répertoire ------ /vues/journaux/stars/cinerevelation/1957/t4/C_REVEL_195th1.jpg Est dans 2: /vues/journaux/stars/cinerevelation/1957/t4 Veut trouver 2: /vues/journaux/stars/cinerevelation/1957 A trouvé 2: /vues/journaux/stars/cinerevelation/1957 Est dans 2: /vues/journaux/stars/cinerevelation/1957 Veut trouver 2: /vues/journaux/stars/cinerevelation A trouvé 2: /vues/journaux/stars/cinerevelation ----------- Ici changework directory échoue et getcurrentdir renvoie une valeur fantaisite ---- Echec 0 de: 250 CWD command successful vers: /vues/journaux/stars/cinerevelation/1958 ----------- Mais le second getcurrentdir qui suit aussitôt renvoie la valeur correcte ------- Est dans 2: /vues/journaux/stars/cinerevelation/1958 ----------- Tout le répertoire ci-dessus sera ignoré --------- Veut trouver 2: /vues/journaux/stars/cinerevelation A trouvé 2: /vues/journaux/stars/cinerevelation /vues/journaux/stars/cinerevelation/1959/C_REVEL_249.jpg /vues/journaux/stars/cinerevelation/1959/C_REVEL_249th1.jpg ---------- Meme chose, le répertoire /vues/bd/dargaud sera ignoré ----- /vues/bd/dargaud/pilote/PILREL_56_01.jpg Est dans 2: /vues/bd/dargaud/pilote Veut trouver 2: /vues/bd/dargaud Echec 2 de : 250 CWD command successful ver: /vues/bd/dargaud A trouvé 2: /vues/bd/dargaud Est dans 2: /vues/bd/dargaud/sf Veut trouver 2: /vues/bd/dargaud A trouvé 2: /vues/bd/dargaud
Partager