IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Utilisation de FindFirst en récursif [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2017
    Messages : 9
    Par défaut Utilisation de FindFirst en récursif
    Bonjour,

    j'utilise la fonction FindFirst en récursif pour scruter les fichiers et sous répertoires d'un répertoire donné.
    J'aimerais, dans chaque sous-répertoire, créer un fichier html qui comprend tous les fichiers et les dossiers présents.
    Chaque sous répertoire contiendrait un fichier html qui afficherait les dossiers et fichiers contenus dans celui-ci.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    procedure TForm1.Button1Click(Sender: TObject);
    var Path: string;
    begin
    if SelectDirectory('Répertoire', '', Path) = true then
      begin
        Browse(Path);
      end;
    end;
     
    procedure TForm1.Browse(Path: string);
    var Rec: TSearchRec;
        sPath: string;
    begin
    Path := IncludeTrailingPathDelimiter(Path);
    if FindFirst(Path + '*.*', faAnyFile, Rec) = 0 then
      repeat
      if (Rec.Name <> '.') and (Rec.Name <>  '..') then
        begin
        if (Rec.Attr and faDirectory) <> 0 then
          begin
          sPath := Path + Rec.FindData.cFileName;
          Browse(sPath);
          end
        else
          begin
          Memo.Lines.Add('<a href="' + Path + Rec.FindData.cFileName + '">'+ Rec.FindData.cFileName + '</a><br>');
          end;
        end;
      until FindNext(Rec) <> 0;
      Memo.Lines.SaveToFile(Path + '\index.html');
      Memo.Lines.Clear;
    FindClose(Rec);
    end;
    ... qui ne marche pas !

    Vous auriez une idée ?

    Merci.

    Selticq.

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 055
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Je pense qu'il ne faut pas spécifier de joker d'extension dans le paramètre de recherche ("*" au lieu de "*.*") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FindFirst(Path + '*', faAnyFile, Rec)
    P.S. J'ai déplacé vers le forum Lazarus, mais il s'agit peut-être de Delphi ?
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    Membre émérite
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Par défaut
    Bonjour

    Il me semble que l'erreur vient de l'utilisation dans un contexte récursif d'un unique Memo global pour stocker les fichiers de chaque répertoire. Il est effacé à la fin, donc on perd les fichiers du répertoire parent.

    De plus, un composant visuel n'est pas utile ici.

    Il te faut créer une TStringList au début de la procédure Browse, et la détruire à la fin, et remplacer Memo.Lines par son nom.

  4. #4
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 134
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 134
    Par défaut
    Citation Envoyé par selticq Voir le message
    Voici mon code :

    ... qui ne marche pas !
    qui ne marche pas n'est pas un message d'erreur valide et

    C'est terrible des trucs comm' ça...

  5. #5
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Bonjour.

    Il te faut une procédure extérieure à Browse qui va lister les fichiers du path en cours.
    Elle doit être appelée au début de la recherche, sinon tu ne listes pas les fichiers contenus dans le dossier de départ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    procedure SearchFiles(Dir: string);
    var
       SearchRec: TSearchRec;
    begin
       if FindFirstUTF8(Dir + '*.*',  faAnyFile, SearchRec) = 0 then
       repeat
          if (SearchRec.Attr and faDirectory) = 0 then // trouvé un fichier et non un dossier
            Form1.Memo1.Lines.Add('<a href="' + Dir + SearchRec.FindData.cFileName + '">'+ SearchRec.FindData.cFileName + '</a><br>');
       until FindNextUTF8(SearchRec) <> 0;
       FindCloseUTF8(SearchRec);
    end;
     
    procedure Browse(Dir: string);
    var
       Rec: TSearchRec;
    begin
       if FindFirstUTF8(Dir + '*.*', faAnyFile , Rec) = 0 then
       repeat
          if (Rec.Name <> '.') and (Rec.Name <> '..') and ((Rec.Attr and faDirectory) <> 0) then
          // trouvé un dossier et non un fichier
          begin
             SearchFiles(Dir + IncludeTrailingPathDelimiter(Rec.Name));
             Browse(Dir + IncludeTrailingPathDelimiter(Rec.Name));
          end;
       until FindNextUTF8(Rec) <> 0;
       FindCloseUTF8(Rec);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      path: string;
    begin
       if selectdirectory('','',path) then
       begin
          SearchFiles(IncludeTrailingPathDelimiter(Path));
          Browse(IncludeTrailingPathDelimiter(Path));
       end;
    end;
    Remarque : ajoute dans les uses l'unité LazFileUtils pour éviter les warning "deprecated".

    Cordialement
    Thierry

  6. #6
    Membre émérite
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Par défaut
    @ThWilliam

    Ce n'est pas ce qui est demandé, il faut créer dans chaque dossier un fichier html contenant les fichiers du dossier.
    Dans ta solution tu ne fais qu'afficher tous les fichiers trouvés récursivement.

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    salut

    sauf qu'il donne la solution implicitement vu
    qu'il n'affiche les fichiers que d'un dossier à la fois


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure SearchFiles(Dir: string);
    var
       SearchRec: TSearchRec;
    begin
       Form1.Memo1.Lines.clear; 
       if FindFirstUTF8(Dir + '*.*',  faAnyFile, SearchRec) = 0 then
       repeat
          if (SearchRec.Attr and faDirectory) = 0 then // trouvé un fichier et non un dossier
            Form1.Memo1.Lines.Add('<a href="' + Dir + SearchRec.FindData.cFileName + '">'+ SearchRec.FindData.cFileName + '</a><br>');
       until FindNextUTF8(SearchRec) <> 0;
       FindCloseUTF8(SearchRec);
       Form1.Memo1.SaveToFile(IncludeTrailingPathDelimiter(Dir)+'index.html');
    end;

  8. #8
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    @tintinux et anapurna:

    J'avais mal lu la demande, merci pour la correction.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. FindFirst FindNext en récursif
    Par khayyam90 dans le forum Contribuez
    Réponses: 0
    Dernier message: 04/01/2011, 14h24
  2. Utilisation de FindFirst
    Par JP.NUAGE dans le forum Langage
    Réponses: 17
    Dernier message: 15/10/2009, 14h04
  3. Utilisation de FindFirst dans la Base de Donnée
    Par vodiv dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/06/2008, 13h52
  4. Comment je peux utiliser Findnext FindFirst
    Par zizo89 dans le forum Delphi
    Réponses: 5
    Dernier message: 17/05/2007, 16h19
  5. comment utiliser Findfirst et FindNext
    Par oumarsaw dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 18/04/2006, 11h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo