Exploration récursive de répertoire

Contenu du snippet

J'en avais un peu marre du copier/coller à chaque fois que je devais explorer un répertoire.. du coup, voici une fonction générique qui fait le boulot et renvoie le résultat dans un TStrings. On lui passe le chemin d'un répertoire de base, un filtre genre '*.pdf',et 2 paramètres optionnels.
Côté pratique: si on lui passe un TStrings, le résultat est ajouté à la fin de la liste, sinon création d'une nouvelle liste. La récursivité est aussi optionnelle (récursive par défaut), même si l'intérêt d'une telle fonction est justement la récursivité!

Source / Exemple :


{------------------------------------------------------------------------------
  Objet: Renvoie une liste des fichiers trouvés.
  Paramètres: -aRep = répertoire de départ
              -aFilter = filtre (ex: '*.tif')
              -aFileType = type de fichiers recherchés (faAnyFile, ...)
              -NoExtApart = Dans le cas où aFilter='*', doit-on lister tous les
                    fichiers (False) ou uniquement ceux sans extension (True)?
              -aList (optionnel) = si nil, création d'une nouvelle liste; sinon
                    ajout à la fin de la liste passée en argument
              -Recurse (optionnel) = récursif? (True par défaut)
 ------------------------------------------------------------------------------}
function ScruterRepertoire(aRep, aFilter: String; aFileType: Integer; NoExtApart: Boolean;
                           aList:TStrings = nil; Recurse: Boolean = True): TStrings;
var
  info: TSearchRec;
  Dir: String;
begin
  if aList<>nil then Result:= aList
  else Result:= TStringList.Create;

  if aRep[Length(aRep)]='\' then Dir:= aRep
  else Dir:= aRep + '\';

  if FindFirst(Dir + aFilter, aFileType, info)=0 then
    repeat
      if (info.Attr and faDirectory =0) then  //fichier
        // Si on ne veut que les fichiers sans ext et que le fichier en a une, on le zappe!
        if not (NoExtApart and (aFilter='*') and (ExtractFileExt(info.Name)<>'')) then
            Result.Add(Dir + info.FindData.cFileName);
    until FindNext(info)<>0;
  FindClose(info);

  if Recurse then
    begin
      if FindFirst(Dir + '*', faDirectory, info)=0 then
        repeat
          if (info.Attr and faDirectory <>0) and (info.Name<>'.') and (info.Name<>'..') then
              ScruterRepertoire(Dir + info.FindData.cFileName, aFilter, aFileType, NoExtApart, Result, Recurse);
        until FindNext(info)<>0;
      FindClose(info);
    end; //end if recurse
end;

Conclusion :


Tout commentaire bla bla bla...

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.