EXPLORATION RÉCURSIVE DE RÉPERTOIRE

JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 - 19 oct. 2009 à 10:40
defis91 Messages postés 65 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 8 août 2011 - 16 nov. 2009 à 16:42
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/50706-exploration-recursive-de-repertoire

defis91 Messages postés 65 Date d'inscription samedi 29 octobre 2005 Statut Membre Dernière intervention 8 août 2011
16 nov. 2009 à 16:42
Pour FOXI
Bonjour,
Ton programme fonctionne après deux petites modifs.
Supprimer les lignes :
if aList <> nil then exit; ou mettre : if aList = nil then exit;
et
aList.Clear; sinon à chaque récursion on pert le début de la recherche !
Ta procedure a été appelée pour le test par :

Création d'un bouton, Edit1 pour le dossier, Edit2 pour le filtre, et Memo1 pour le résulat.

procedure TForm1.Button1Click(Sender: TObject);
var S:TStrings; i:integer;
FileType: integer;
begin
try
S := TStringList.Create;
S.Clear;
FileType:=faHidden+faSysfile+faVolumeID+faDirectory+faArchive+faAnyFile;
ScruterRepertoire(Edit1.Text, Edit2.Text, FileType, S, True);
for i:=0 to S.Count-1 do Memo1.Lines.Add(S[i]);
finally
S.Free;
end;
end;
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
20 oct. 2009 à 13:20
Petit commentaire sur l'ajout du paramètre NoExtApart:

quand on utilise FindFirst, on peut lister tous les fichiers avec extensions ('*.*') ou tous les fichiers ('*'). J'ai ajouter ce paramètre pour y remédier; si on met le paramètre à True, le filtre '*' ne renverra que les fichiers SANS extension; si le paramètre est False, c'est le fonctionnement classique..
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
20 oct. 2009 à 09:28
@fOxi: Oui, si on veut... 2 remarques cependant:
1- Si on passe une liste <> nil , on zappe => pas moyen de concaténer plusieurs recherches dans la même liste;
2- ton FindFirst comporte un filtre et un "FileType" => tu n'explores que les sous-répertoires qui correspondent au filtre; pour peu que ton filtre ne concerne pas les répertoires, ta procédure n'est plus récursive...
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
20 oct. 2009 à 01:43
procedure ScruterRepertoire(const aRep, aFilter: String; const aFileType: Integer; aList: TStrings; const Recurse: Boolean = True);
var
info : TSearchRec;
fPrm : string;
begin
if aList <> nil then
exit;

fPrm := aRep;
if fPrm[Length(fPrm)] <> '\' then
fPrm := fPrm + '\';

aList.BeginUpdate;
try
aList.Clear;
if FindFirst(fPrm+aFilter, aFileType, info) = 0 then
case Recurse of
false :
repeat
if (info.Attr and faDirectory) = 0 then
aList.Add(fPrm + info.FindData.cFileName);
until FindNext(info) <> 0;
true :
repeat
if (info.Attr and faDirectory) <> 0 then
begin
if (info.Name <> '.') and (info.Name <> '..') then
ScruterRepertoire(fPrm + info.FindData.cFileName, aFilter, aFileType, aList, Recurse)
end
else
if (Info.Attr and faDirectory) = 0 then
aList.Add(fPrm + Info.FindData.cFileName);
until FindNext(info) <> 0;
end;
finally
findClose(info);
aList.EndUpdate;
end;
end;
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
19 oct. 2009 à 14:48
Salut Bacterius,
n'étant pas sûr de tout ce que je vais dire (écrire!), je parle sous le contrôle de la communauté:
les '.' et '..' sont respectivement le répertoire courant et le répertoire parent. Je pense que c'est grossomodo comme ça que Windows sait où il se situe dans le système de fichiers. on voit ces répertoires quand on fait un 'dir' dans la ligne de commande, ou dans certaines applis développées pour d'anciennes versions de Windows (versions 3.xx). Le répertoire '..' était affiché dans l'explorateur pour permettre de remonter au répertoire parent. Donc non, ce n'est pas un bug, ce sont bien des répertoires, ou au moins des raccourcis. Si tu tapes 'cd .' dans l'invite de commande, tu changes de répertoire et te repositionnes sur...le même répertoire!!! si tu tapes 'cd ..' tu remontes au rep parent.

En ce qui concerne Callback, je te remercie pour la piste, je vais explorer ça.

@+
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
19 oct. 2009 à 14:24
Intéressant ... Une chose m'a toujours fait me poser une question, et peut-être as-tu la réponse Jeremy : pourquoi les routines d'exploration de répertoire FindFirst/Next renvoient-elles des "." ou "..", obligeant à filter ... S'agit-il de dossiers, ou encore de fichiers cachés, où est-ce un bug.

Ce que tu veux faire est un callback (en gros) :

type
TFileCallback = procedure (Paramètres);

Tu ajoutes un paramètre TFileCallback à ta méthode. Puis tu l'appelles à chaque fois qu'il doit être appellé : MonParametre(Paramètres).

Si j'ai bien compris ta question.

Cordialement, Bacterius !
JeremyLecouvert Messages postés 139 Date d'inscription mardi 27 novembre 2007 Statut Membre Dernière intervention 10 mai 2010 2
19 oct. 2009 à 10:40
Au départ, je voulais passer en argument de la fonction une méthode à exécuter sur chaque fichier... mais chai po l'faire!!
Il me semble qu'on doit passer la référence de la méthode, mais je ne sais ni comment l'appliquer, ni comment gérer les paramètres de ma méthode référencée.
Donc si quelqu'un a des tuyaux, je suis preneur...
Rejoignez-nous