Salut à tous,
Je cherche à charger tous les répertoires et sous-répertoires d'un site FTP dans un TreeNode.
Pour cela j'ai fait une procédure récursive :
La structure du FTP est la suivante :
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 var ListDir : array[0..10] of TIdFTPListItems; Node: array[0..10] of TTreeNode; procedure TFProcess.B_ChargeRepClick(Sender: TObject); begin treeview1.items.Clear; node[0]:=treeview1.Items.AddObject(nil,'/', ImageList1); // Charge les répertoires distants List(nil); Charge_FTP_Rep(1); end; procedure TFProcess.Charge_FTP_Rep(PNiv :integer); var i:integer; Nb_Dir :integer; begin with IdFTP1 do begin // Charge la liste des répertoires et des fichiers du répertoire courant List(nil); ListDir[PNiv] := DirectoryListing; if ListDir[PNiv].Count > 0 then begin // compte la liste des répertoires dans le répertoire courant Nb_Dir:=0; for i:=0 to ListDir[PNiv].Count - 1 do if (ListDir[PNiv].Items[i].ItemType = ditDirectory) then Inc(Nb_Dir); // S'il y a au moins un répertoire, on récupère les noms if Nb_Dir > 0 then begin for i:=0 to ListDir[PNiv].Count - 1 do begin // Si c'est un répertoire if (ListDir[PNiv].Items[i].ItemType = ditDirectory) then begin // Ajoute le répertoire dans l'arborescence Node[PNiv]:=treeview1.Items.AddChildObject(node[PNiv-1], ListDir[PNiv].Items[i].FileName, ImageList1); // Recherche les sous-répertoires du répertoire courant ChangeDir(ListDir[PNiv].Items[i].FileName); Charge_FTP_Rep(PNiv+1); ChangeDirUp; end; // if ditDirectory end; // for i end; // if Nb_Dir > 0 end; // if ListDir[PNiv].Count > 0 end; // with IdFTP1 end;
A l'exécution, dans mon TreeNode j'obtiens :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 / Cartes Impression Immo Photos Vignettes PH Save
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 +/ +Cartes Impression
Tout se passe bien jusqu'au sous-rep Impression, mais lorsque la fonction revient au PNiv=1 (le /, pour continuer dans Immo), le ListDir[1].Count est passé à 0, alors qu'il était bien à 3 au départ, et donc déclenche une erreur d'indice hors-limite ????
Avec des Showmessage, je vois que le ListDir[1] est réinitialisé dès l'appel de la procédure avec PNiv=2, ce qui n'est pas normal vu que c'est un tableau global, et non local, ses valeurs devraient être conservées si on change d'indice.
Si je ne mets pas List(nil) en début de fonction, alors le programme va chercher un répertoire /cartes/cartes, qui bien entendu n'existe pas, donc erreur.
J'ai vu d'autres posts sur des problèmes similaires, mais je n'ai pas trouvé de solution à mon problème.
Quelqu'un voit-il pourquoi ListDir[] est réinitialisé à vide lorsque la procédure descend au niveau suivant ??
Partager