Recherche récursive

Soyez le premier à donner votre avis sur cette source.

Vue 6 721 fois - Téléchargée 482 fois

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

Ajouter un commentaire

Commentaires

Messages postés
19
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
23 janvier 2008

Merci pour la réponse, même si c'est 2 ans après, ça peux encore me servir, je vais essayer...
Messages postés
8
Date d'inscription
mardi 10 août 2004
Statut
Membre
Dernière intervention
24 août 2004

Normal pour le bug du dossier "pas scanné" ...

Il faut rajouter:
FolderFound := RootFolder + SearchDirRec.Name + '\';
FileSearching(FolderFound, FileExt);
DirectorySearching(FolderFound, FileExt, true);

après le premier "IF" dans SearchDirectory();

Voilou :)
Messages postés
19
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
23 janvier 2008

il y a un petit bug, il y a toujours un sous-dossier qui n'est pas "scanné", je ne sais pas si c'est le premier ou le dernier.
Donc quand tu compare ton prog avec la recherche de Windows il y a une sacrée différence.
Je suis trés intéressé et j'espère que tu trouvera la solution.
9/10 - Manu.

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.