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 71
|
uses Windows, Classes, SysUtils, Dialogs;
...
...
implementation
{$R *.DFM}
// ======================================================
// Arborescence des dossiers par récursivité indirecte
// ======================================================
var SLDir : TStringList; // liste pour résultat
function IncludeTrailing(const S: string) : string;
//Met un "\" à la fin du nom du dossier s'il manque
//La fonction IncludeTrailingDelimiter n'est pas implémentée dans Delphi 3
begin
Result:=S;
if not IsPathDelimiter(Result,Length(Result)) then Result:=Result+'\';
end;
function IsDirectory(SRec:TSearchRec) : boolean;
// Renvoie True si le paramètre est un dossier
begin
IsDirectory:= SRec.Attr and faDirectory <> 0;
end;
procedure AddSubDirs(Dir,Mask : string; Index:integer);
var AttrWord : integer;
Pntr, s1, s2 : string;
SR : TSearchRec; //variable de recherche
begin
AttrWord:=faDirectory or faReadOnly or faArchive or faHidden or faSysFile;
{$I-} ChDir(Dir); {$I+} //évite des erreurs ES
while Mask<>'' do
begin
// Prend le 1er masque dans le filtre
if Pos(';',Mask)=0 then Pntr:=Mask
else Pntr:=Copy(Mask,1,Pos(';',Mask)-1);
// Recherche des dossiers
if FindFirst(IncludeTrailing(Dir)+Pntr, AttrWord, SR)=0 then
begin
repeat
s1:=ExtractFileName(SR.Name); // nom du prétendu dossier
s2:=IncludeTrailing(Dir+s1); // chemin complet du fichier ou dossier
if (s1<>'.') and (s1<>'..') and (IsDirectory(SR)) then // on ne garde que les dossiers
SLDir.Insert(Index+1, UpperCase(s2)); // ajout du dossier à la récurrence. Sera récursé au prochain passage
until FindNext(SR)<>0; // arrêt s'il n'y a plus rien
SysUtils.FindClose(SR);
end;
// On passe au filtre suivant s'il en reste
if Pos(';',Mask)=0 then Break
else Mask:=Copy(Mask,Pos(';',Mask)+1,Length(Mask));
end; // while Mask..
end; // AddSubDirs
procedure RecurseSubFolder(Racine : string);
var Index : integer;
begin
Racine:=IncludeTrailing(Racine); //répertoire racine
SLDir.Clear; //on vide le résultat pour commencer
SLDir.Add(UpperCase(Racine)); //initialisation de la récurrence
Index:=0; //on démarre à 0
//Récurrence indirecte
repeat
AddSubDirs(SLDir[Index],'*.*',Index); // on ajoute les sous-dossiers
inc(Index); //on passe à l'item suivant
until (Index>=SLDir.Count);
SLDir.Sort; //on trie pour achever si besoin est
end; // RecurseSubFolder |
Partager