Recensement simple et exhaustif d'une arborescence

Contenu du snippet

Le répertoire A a 4 sous-repertoires A1,A2,A3,A4 qui ont eux-même 4 sous-repertoires.
On veut lister les fichiers du répertoire A au "sous-sous-sous-repertoire" Annnn.
Une solution en boucle un TstringList qui sert d'entree en recherche et s'alimente du resultat de la recherche.

Source / Exemple :


procedure TForm1.CreerlisteRep(RepRacine: string);
var   cc,dd:integer;
      entreeL:string;
      xr:TsearchRec;

begin
//BUT :RECENSER TOUS LES SOUS-REP SUSCEPTIBLES DE CONTENIR
//DES FICHIERS

//sur la base d'un repertoire racine ajouté à la liste des sous rep
//-on recherche un sous-repertoire
//-si on le trouve on le rajoute à la liste des sous-rep et
//ajoute +1 au nb d'items figurant dans la liste
//-plus loin, ce sous-repertoire servira de répertoire racine
//-l'opération est terminée quand l'indice incrémenté=nb d'items -1

  //mise à blanc
  ListeSousRep.Clear;
  //récupération premier repertoire
  ListeSousRep.add(RepRacine);

  //nb d'item de départ
  dd:=ListeSousRep.Count;

  //indice de la liste
  cc:=0;
  //boucle tant que indice<nb items-1
  while CC<=dd-1 do
     begin //a2
         //repertoire racine
        entreeL :=ListeSousRep.strings[cc];
        //recherche de sous-rep
        if findfirst(entreeL+'*.*',FaDirectory,xr)=0 then
          begin  //a1
            //ajout si sous-rep trouve et incrementation de 1 de dd
            if (xr.name[length(xr.name)]<>'.')
               and ((xr.Attr and faDirectory)=FaDirectory)
               and  (ListeSousRep.IndexOf(entreeL+xr.name+'\')=-1) then
                  begin
                    ListeSousRep.Add(entreeL+xr.name+'\');
                    dd:=dd+1;
                  end;
            //boucle de recherche
            while findnext(xr)=0 do
              begin
                  if (xr.name[length(xr.name)]<>'.')
                     and ((xr.Attr and faDirectory)=FaDirectory)
                     and  (ListeSousRep.IndexOf(entreeL+xr.name)=-1) then
                      begin
                        ListeSousRep.Add(entreeL+xr.name+'\');
                        dd:=dd+1;
                      end;
              end;
          end; //a1
          //fermeture recherche pour repertoire racine
          findClose(xr);
          //incrementation de l'indice de liste
          cc:=cc+1;
     end; //a2
End;

Conclusion :


Procedure exigeant un string en entree.
La boucle s'arrête quand l'indice d'interrogation est egal au nb d'items-1.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.