Recherche récursive

Description

un algorithme classique mais qui peut toujours servir
l'unité propose la procedure suivante :
PROCEDURE Searching (RootFolder : shortstring; CONST FileExt : shortstring; CONST Recursive : boolean);
on accède au résultat de la recherche dans les variables globales (TabFilePath,TabFileSize, et NBFilesFound)

Source / Exemple :


//Unité de Recherche Récursive
//Créée par MORLET Alexandre en 2002
//Searching est la routine principale à être appelée
//Ces trois arguments sont
//1.Répertoire Racine à partir duquel la recherche s'effectue
//2.Extension de Fichier à rechercher (3 caractères en général)
//3.Une valeur booléenne autorisant oui ou non une recherche récursive

UNIT U_Searching;

INTERFACE

USES SysUtils;

//Seule cette procedure est accessible de l'extérieur
PROCEDURE Searching (RootFolder : shortstring; CONST FileExt : shortstring; CONST Recursive : boolean);

//TabFilePath : Tableau dynamique mémorisant le chemin de tous les fichiers recherchés
//TabFilesize : Tableau dynamique mémorisant la taille de tous les fichiers recherchés
//NBFileFound : Le Nombre total de fichiers trouvés
VAR
    TabFilePath : ARRAY OF shortstring;
    TabFileSize : ARRAY OF integer;
   NBFilesFound : integer;
      TotalSize : integer;

IMPLEMENTATION

//Recherche de fichiers d'extension "FileExtension" dans un répertoire "Directory"
PROCEDURE FileSearching (CONST Directory, FileExt : shortstring);
VAR
SearchFileRec : TSearchRec;
BEGIN
IF FindFirst(Directory + '*.' + FileExt, faAnyFile, SearchFileRec)=0 THEN
   BEGIN
   NBFilesFound := NBFilesFound + 1;
   setLength(TabFilePath, NBFilesFound);
   setLength(TabFileSize, NBFilesFound);
   TabFilePath[NBFilesFound-1] := Directory + SearchFileRec.Name;
   TabFilesize[NBFilesFound-1] := SearchFileRec.Size;
   WHILE FindNext(SearchFileRec)=0 DO
         BEGIN
         NBFilesFound := NBFilesFound + 1;
         setLength(TabFilePath, NBFilesFound);
         setLength(TabFileSize, NBFilesFound);
         TabFilePath[NBFilesFound-1] := Directory + SearchFileRec.Name;
         TabFileSize[NBFilesFound-1] := SearchFileRec.Size;
         END;
   END;
FindClose(SearchFileRec);
END;

//Recherche récursive ou non à partir d'un répertoire racine "RootFolder"
PROCEDURE DirectorySearching (CONST RootFolder, FileExt : shortstring; CONST Recursive : boolean);
VAR
SearchDirRec : TSearchRec;
FolderFound : STRING;
BEGIN

FindFirst(RootFolder + '*', faDirectory, SearchDirRec);

//Test permettant de déterminer s'il s'agit bien d'un dossier et non d'un fichier
//C'est un dossier si : "valeur de l'attribut (nombre entier) AND constante d'attribut (faDirectory) > 0)
//"." et ".." représente respectivement le répertoire courant et le répertoire parent
IF (SearchDirRec.Name<>'.') AND (SearchDirRec.Name<>'..') AND ((SearchDirRec.Attr AND faDirectory)>0) THEN
    FolderFound := RootFolder + SearchDirRec.Name;

while FindNext(SearchDirRec)=0 DO
      IF (SearchDirRec.Name<>'.') AND (SearchDirRec.Name<>'..') AND ((SearchDirRec.Attr AND faDirectory)>0)THEN
          BEGIN
          FolderFound := RootFolder + SearchDirRec.Name + '\';
          FileSearching(FolderFound, FileExt);
          DirectorySearching(FolderFound, FileExt, true);
          END;
FindClose(SearchDirRec);
END;

PROCEDURE Searching (RootFolder : shortstring; CONST FileExt : shortstring; CONST Recursive : boolean);
VAR
i : integer;
BEGIN
NBFilesFound := 0;
TotalSize := 0;
IF Length(RootFolder) > 3 THEN RootFolder := RootFolder + '\';
FileSearching(RootFolder, FileExt);
IF Recursive THEN DirectorySearching (RootFolder, FileExt, Recursive);
IF NBFilesFound > 0 THEN
   FOR i:=0 TO Length(TabFileSize) - 1 DO
       TotalSize := TotalSize + TabFileSize[i];
END;

END.

Conclusion :


Je crois que mes commentaires parlent d'eux-mêmes.
Faîtes-moi part de vos suggestions (w413x@free.fr).
Si vous appréciez mon travail, je continuerais à envoyer mes sources.

Codes Sources

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.