Recherche récursive

Soyez le premier à donner votre avis sur cette source.

Vue 7 188 fois - Téléchargée 513 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
MagicManu Messages postés 19 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 23 janvier 2008
11 sept. 2004 à 14:14
Merci pour la réponse, même si c'est 2 ans après, ça peux encore me servir, je vais essayer...
sym0ne Messages postés 8 Date d'inscription mardi 10 août 2004 Statut Membre Dernière intervention 24 août 2004
13 août 2004 à 16:45
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 :)
MagicManu Messages postés 19 Date d'inscription dimanche 22 octobre 2000 Statut Membre Dernière intervention 23 janvier 2008
16 juil. 2002 à 16:33
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.