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.)

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;
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
 
---- 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