Relever certains des fichiers scannés

Résolu
cs_JackNUMBER Messages postés 233 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 26 juin 2011 - 22 mai 2010 à 01:55
cs_JackNUMBER Messages postés 233 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 26 juin 2011 - 24 mai 2010 à 18:50
Bonsoir à tous !
Voilà quelques temps que j'essaie faire un petit script pour parcourir tel un "scan" les fichiers d'un dossier tout en relevant les fichiers commençant par "Gr" (tous affichés dans un CheckListBox).

Voilà mon code pour le scan des fichiers :
Function CompteFichiers(Chemin:String):Integer;
Var S:TSearchRec;
Begin
Chemin:=IncludeTrailingPathDelimiter(Chemin);
Form1.Label2.Caption:=Chemin;
Form1.Label2.Refresh;

Result:=0;
If FindFirst(Chemin+'*.*',faAnyFile,S)=0
Then Begin
Repeat
if (S.Name<>'.')And(s.Name<>'..')
Then Begin
If (S.Attr And faDirectory)<>0
Then Result:=Result+CompteFichiers(Chemin+S.FindData.cFileName)
Else Inc(Result);
End;
Until FindNext(S)<>0;
FindClose(S);
End;
End;
source


Mais je n'arrive pas à intégrer le relevé des fichiers dans la boucle.
Merci de votre aide.

6 réponses

ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
24 mai 2010 à 11:24
Salut.

Puisque tu aimes cette source, voici ta fonction adaptée.
Tu dois rajouter l'unité Masks dans la clause uses.

Function CompteFichiers(Chemin:String): Integer;
Var
   S:TSearchRec;
Begin
   Chemin:= IncludeTrailingPathDelimiter(Chemin);
   Result:= 0;
   If FindFirst(Chemin + '*.*', faAnyFile, S) = 0 then
   Repeat
      if (S.Name<>'.') And (s.Name<>'..') then
      begin
         If (S.Attr And faDirectory) > 0 then
            Result:= Result + CompteFichiers(Chemin + S.Name)
         else
         if MatchesMask(S.Name, 'Gr*.*') then
         begin
            Form1.CheckListBox1.Items.Add(Chemin + S.Name);
            Inc(Result);
         end;
      end;
   Until FindNext(S) <> 0;
   FindClose(S);
End;


A +
Thierry
3
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
22 mai 2010 à 11:39
Salut.

Peux-tu clarifier ce que tu veux faire ?
Je vois que tu veux faire un scan d'un dossier et de tous les sous-dossiers (puisque tu fais un appel récursif à la fonction) pour ajouter dans un CheckListBox tous les fichiers commençant par "Gr".
Or, tu écris une fonction qui ne fait que compter tous les fichiers.
Si tu veux compter uniquement les fichiers commençant par "Gr", il te suffirait en fin de scan de compter le nombre d'items dans ton CheckListBox.
Sinon : pour intégrer le "relevé des fichiers dans la boucle", le principe est simple :
- si tu as affaire avec un directory : appel récursif de la fonction
- si tu as affaire avec un fichier, tu testes s'il commence par "Gr". Exemple :
if Pos('gr', AnsiLowerCase(S.Name) = 1 then
CheckListBox1.Items.Add(S.Name);

A +
Thierry
0
cs_JackNUMBER Messages postés 233 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 26 juin 2011 5
22 mai 2010 à 19:26
Merci de ta réponse.
J'ai trouvé cette source qui me paraissait parfaite pour mon cas et le comptage des fichiers ajoute une petite fonction sympathique. Si il ne pouvais compter que les fichiers commençant par "Gr" ça serait mieux ^^
Je n'ai pas réussi à intégrer ton exemple : Types incompatibles : 'String' et 'Integer'

J'ai essayé ceci mais ça ne marche pas non plus:
  Result:=0;
  If FindFirst(Chemin+'*.*',faAnyFile,S)=0
  then begin
    repeat
      if (S.Name<>'.')And(s.Name<>'..')
      then begin
        If (S.Attr And faDirectory)<>0
          then Result:=Result+CompteFichiers(Chemin+S.FindData.cFileName)
          else
          if (S.Name<>'Gr') //test du fichier
          then CheckListBox1.Items.Add(S.Name);Inc(Result); //relevé
      end;
    until FindNext(S)<>0;
    FindClose(S);
  end;
end;
Identificateur non déclaré : 'CheckListBox1'
0
cs_JackNUMBER Messages postés 233 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 26 juin 2011 5
24 mai 2010 à 15:12
Ha Je ne pensais qu'il faille changer la fonction de la source.
Je ne suis pas très doué pour le Pascal alors j'essayais de me baser le plus possible dessus vu qu'elle me permettait de parcourir les fichiers et de les compter.

Mais si il faut la recommencer je suis partant ! Je vais essayer.
De plus MatchesMask ne passe pas (Delphi 7 ?), il est non-déclaré.

J'essaie de recréer la fonction de "scan" avec les éléments que tu m'as donné dans ton précédent message.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
24 mai 2010 à 15:53
MatchesMask est dans l'unité Masks qui est disponible en Delphi7.
N'as-tu pas oublié de rajouter 'Masks' dans la clause uses de ton unit ?
0
cs_JackNUMBER Messages postés 233 Date d'inscription jeudi 30 septembre 2004 Statut Membre Dernière intervention 26 juin 2011 5
24 mai 2010 à 18:50
Ha oui en effet....
Du coup je n'ai pas changer la fonction (ou si peu).
MERCI !

Aurais-tu quelque chose pour la stopper en cours ? (si l'utilisateur s'ennuie...)
J'ai vu qu'on pouvait mettre Var Stop : boolean = false; mais c'est plus spécifique aux boucle. Et j'aimerai conserver le résultat (les fichier déja relevés).
0
Rejoignez-nous