defis91
Messages postés65Date d'inscriptionsamedi 29 octobre 2005StatutMembreDerniè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és139Date d'inscriptionmardi 27 novembre 2007StatutMembreDernière intervention10 mai 20102 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és139Date d'inscriptionmardi 27 novembre 2007StatutMembreDernière intervention10 mai 20102 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és4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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és139Date d'inscriptionmardi 27 novembre 2007StatutMembreDernière intervention10 mai 20102 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és3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 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és139Date d'inscriptionmardi 27 novembre 2007StatutMembreDernière intervention10 mai 20102 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...
16 nov. 2009 à 16:42
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;
20 oct. 2009 à 13:20
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..
20 oct. 2009 à 09:28
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...
20 oct. 2009 à 01:43
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;
19 oct. 2009 à 14:48
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.
@+
19 oct. 2009 à 14:24
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 !
19 oct. 2009 à 10:40
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...