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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2017
    Messages : 9
    Points : 13
    Points
    13
    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
    7 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 960
    Points : 59 637
    Points
    59 637
    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 ?

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    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 éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 876
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 876
    Points : 15 307
    Points
    15 307
    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 chevronné

    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
    Points : 1 884
    Points
    1 884
    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 éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    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 435
    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 435
    Points : 5 848
    Points
    5 848
    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 chevronné

    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
    Points : 1 884
    Points
    1 884
    Par défaut
    @tintinux et anapurna:

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

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2017
    Messages : 9
    Points : 13
    Points
    13
    Par défaut fonctionne
    La solution de thwilliam avec la correction de @tintinux fonctionne très bien.

    J'ai juste ajouté memo1.Lines.Clear après le memo1.Lines.SaveToFile pour resetter la liste.

    Merci beaucoup.

    ps: J'utilisais un memo juste pour avoir un retour visuel de ce qui se passe (débogage).

+ 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