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

 Delphi Discussion :

Liste de tous les répertoires


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 15
    Points
    15
    Par défaut Liste de tous les répertoires
    Bonsoir,

    Je suis en ce moment en stage dans une SSII et je suis bloqué sur une parti de mon code.
    Je dois lister dans une listbox (ou autres ce n'est pas vraiment le problème en fin de compte) tous les répertoires et sous repertoires d'un dossier.

    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
    39
    40
    41
    42
    43
    44
    45
    46
     
    procedure TForm1.Button1Click(Sender: TObject);
    Var 
    Chemin : String;
    Info   : TSearchRec;
    dir : string;
    i:integer;
    ext:string;
     NbCarExt:integer;
        test3:string;
    nomdossier:string;
    begin
     
             SelectDirectory('Selectionnez un dossier', '', Dir);
     
               Edit1.Text:=dir;
     
      { Pour être sur que la barre oblique finisse le nom du chemin }
      Chemin := IncludeTrailingPathDelimiter(Edit1.Text);
     
     
      { Recherche de la première entrée du répertoire }
      If FindFirst(Chemin+'*.*',faAnyFile,Info)=0 Then
      Begin
        Repeat
          { Les fichiers sont affichés dans ListBox1 }
          { Les répertoires sont affichés dans ListBox3 }
          // le fichier n'est pas un repertoire donc =0
           If (info.Name<>'.')And(info.Name<>'..')
           then begin
          If Not((Info.Attr And faDirectory)=0)
          Then
     
          ListBox3.Items.Add(Info.FindData.cFileName)
     
     
            Else ListBox1.Items.Add(chemin+Info.FindData.cFileName)
           end;
     
          { Il faut ensuite rechercher l'entrée suivante }
        Until FindNext(Info)<>0;
     
        { Dans le cas ou une entrée au moins est trouvée il faut }
        { appeler FindClose pour libérer les ressources de la recherche }
        FindClose(Info);
      End;
    Ce code je l'ai pris de la FAQ de developpez.com
    Seul soucis c'est que sa liste seulement les 1er sous répertoires...
    Donc je me suis dis peut être la solution est la récursivité. Mais je ne vois pas comment la faire cette récursivité (j'ai beaucoup de mal dans ce domaine).

    Donc quelqu'un pourrais me donner un petit coup de pouce , ou me proposer une autre solution ?
    L'objectif étant d'avoir une liste quelque part de tous les sous répertoires d'un dossier.


    Merci d'avance


    PS: Oui il y a des variables qui servent surement à rien mais je nettoyerais après, disons que j'ai effectuer beaucoup de test sans avancez énormément...

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut
    Citation Envoyé par Reality_ Voir le message
    Donc je me suis dis peut être la solution est la récursivité.
    Tout a fait, c'est la solution.
    Citation Envoyé par Reality_ Voir le message
    Mais je ne vois pas comment la faire cette récursivité (j'ai beaucoup de mal dans ce domaine).
    Tu as un exemple de NoNo: 42 - FINDFIRST, FINDNEXT ET FINDCLOSE EN RECURSIF
    A adapter bien sûr, cet exemple se limite à compter les fichiers.

    @+ Claudius.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 464
    Points : 24 888
    Points
    24 888
    Par défaut
    Utilise directement une TDirectoryListBox et TFileListBox !
    Le vrai talent d'un développeur c'est d'utiliser l'outil qui existe déjà ! Economie de temps et d'argent ! Au lieu de vouloir recoder son propre truc !

    Sinon pour la récursivité, je savais bien que je l'avais mis sur le forum :
    comment compter le nombre de files et de répertoire? - fonction GetListFile
    Cela liste les fichiers, mais il est très facile l'adapter pour lister les répertoires !
    Attention PathFile doit contenir un \ terminal pour le dossier de démarrage !
    voir IncludeTrailingPathDelimiter
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Salut

    Merci à vous deux pour votre aide.
    J'ai opter pour la récursivité puisque TDirectoryListox et TFileListBox n'était pas adapter à ce que je voulais faire (du moins je trouve que c'est un peu "chiant" la navigation dans ce type de Listbox plutôt qu'un SelectDirectory() ).

    J'ai donc finalement trouvez la solution :

    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 FindFiles(FilesList: TStringList; StartDir, FileMask: string);
    var
      SR: TSearchRec;
      DirList: TStringList;
      IsFound: Boolean;
      i: integer;
    begin
      if StartDir[length(StartDir)] <> '\' then
        StartDir := StartDir + '\';
     
      { Build a list of the files in directory StartDir
         (not the directories!)                         }
     
      IsFound :=
        FindFirst(StartDir+FileMask, faAnyFile-faDirectory, SR) = 0;
      while IsFound do begin
        FilesList.Add(StartDir + SR.Name);
        IsFound := FindNext(SR) = 0;
      end;
      FindClose(SR);
     
     // Build a list of subdirectories
      DirList := TStringList.Create;
      IsFound := FindFirst(StartDir+'*.*', faAnyFile, SR) = 0;
      while IsFound do begin
        if ((SR.Attr and faDirectory) <> 0) and
             (SR.Name[1] <> '.') then
          DirList.Add(StartDir + SR.Name);
        IsFound := FindNext(SR) = 0;
      end;
      FindClose(SR);
     
      // Scan the list of subdirectories
      for i := 0 to DirList.Count - 1 do
        FindFiles(FilesList, DirList[i], FileMask);
     
      DirList.Free;
    end;
    Donc cela fonctionne bien, j'obtiens au final dans ma listbox tous les fichiers sauf que l'aborescence n'est pas conserver. Avez vous une solution si je veux conserver cette arborescence ?

  5. #5
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Tu stockes les résultats de la recherche dans une StringList (qui je pense est affectée à une ListBox).

    Il n'y a pas de notion d'arborescence dans ce cas. Utilise plutôt un TreeView.

    @+ Claudius.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 464
    Points : 24 888
    Points
    24 888
    Par défaut
    utilise aussi la fonction IncludeTrailingPathDelimiter pour ajouter le \ terminal au lieu de le faire à la main (même si c'est la même chose)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Tu stockes les résultats de la recherche dans une StringList (qui je pense est affectée à une ListBox).

    Il n'y a pas de notion d'arborescence dans ce cas. Utilise plutôt un TreeView.
    Peut tu développez ta solution ? Cela fait que depuis lundi que je "code" en delphi

    (d'ailleurs mon chef d'entreprise ne m'as meme pas installer la documentation du F1 "l'espace de nommage de RAD blabla n'est pas disponible " donc c'est un peu la galere lorsque je vois partout "tape F1" XD )

    Bref, d'après ce que j'ai compris sur le treeview (c'est a dire pas grand chose) cela permet de lister les répertoire et sous répertoire mais le soucis c'est que mon objectif c'est un copier/coller via un flux. C'est à dire que là dans l'état actuel des choses j'arrive a copier tous les fichiers. Seulement, j'aimerai copier aussi l'arborescence et je ne vois pas vraiment comment faire :s

    Citation Envoyé par ShaiLeTroll
    utilise aussi la fonction IncludeTrailingPathDelimiter pour ajouter le \ terminal au lieu de le faire à la main (même si c'est la même chose)
    Bien vu

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Salut,

    Tu peux trouver ici : http://www.developpez.net/forums/sho...hlight=Dossier
    voir message du 06/12/2007, 16h52 un code qui renvoie l'arborescence d'un dossier par récusivité dans une TStringList.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  9. #9
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Tu peux trouver ici : http://www.developpez.net/forums/sho...hlight=Dossier
    voir message du 06/12/2007, 16h52 un code qui renvoie l'arborescence d'un dossier par récusivité dans une TStringList.
    Ton code à l'air très intéressant de ce que j'ai vu, manque plus que j'arrive a l'adapter. En tous cas je pense que c'est une des solutions que je peux exploiter en effet. Merci de ton aide.
    Je m'y colle un peu plus tard et je fournirai ce que j'arrive à faire

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 464
    Points : 24 888
    Points
    24 888
    Par défaut
    Pour l'aide, je serais toi, je réclamerais le CD ou même je téléchargerais depuis le Net, la Documentation RAD studio s'installe séparément du Studio !

    Sinon, il existe une version en ligne : Page d'accueil - Référence VCL/RTL donc pas d'excuse pour aller la consulter !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Reality_ :
    Ton code à l'air très intéressant ...
    ... en fait il n'est pas de moi, je l'avais touvé il y a longtemps sur le net mais je ne me souviens plus où.

    En relisant ta discussion j'ai vu le truc suivant que je n'avais pas remarqué :
    Bref, d'après ce que j'ai compris sur le treeview (c'est a dire pas grand chose) cela permet de lister les répertoire et sous répertoire mais le soucis c'est que mon objectif c'est un copier/coller via un flux. C'est à dire que là dans l'état actuel des choses j'arrive a copier tous les fichiers. Seulement, j'aimerai copier aussi l'arborescence et je ne vois pas vraiment comment faire
    ... à ce sujet je signale que le TreeView ne permet de lister l'arborescence que si on lui fournit toutes les données de cette arborescence, autrement dit si tu pars avec le code du lien que j'ai cité il faut charcuter les chaînes de caractères de la StringListe SLDir pour alimenter les items du TreeView qui n'est rien d'autre qu'une sorte de conteneur. Le résultat ressemblera à l'arborescence de l'Eplorateur Windows.

    Si c'est ton objectif, tu peux trouver un exemple de code assez pédagogique qui montre comment gérer un TreeView

    Pour le faire fonctionner sous D5 j'ai dû apporter les deux retouches suivantes dans l'unité Main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    implementation
     
    uses //ImgList, < unité non fournie dans le zip téléchargé, mais ça marche quand même avec le ImageList1
         About; // <- unité fournie mais pas indispensable.
     
    {$R *.DFM}
    // $R Windowsxp.res  <- pas indispensable : utile seulement si on veut des boutons au look de XP à condition de disposer du fichier Windowsxp.res
    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  12. #12
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Pour l'aide, je serais toi, je réclamerais le CD ou même je téléchargerais depuis le Net, la Documentation RAD studio s'installe séparément du Studio !

    Sinon, il existe une version en ligne : Page d'accueil - Référence VCL/RTL donc pas d'excuse pour aller la consulter !
    Merci, c'est fait

    Citation Envoyé par Gilbert Geyer
    ... à ce sujet je signale que le TreeView ne permet de lister l'arborescence que si on lui fournit toutes les données de cette arborescence, autrement dit si tu pars avec le code du lien que j'ai cité il faut charcuter les chaînes de caractères de la StringListe SLDir pour alimenter les items du TreeView qui n'est rien d'autre qu'une sorte de conteneur. Le résultat ressemblera à l'arborescence de l'Eplorateur Windows.
    Je précise mon but : en faite je ne cherche nullement a connaitre l'arborescence proprement dites (meme si je pense que c'est obliger pour reconstruire l'arborescence) puisque mon objectif est uniquement de faire par exemple un copier > coller d'un dossier en conservant l'arborescence du dossier copier.
    Là j'arrive seulement à copier tous les fichiers que je met dans un dossier du meme nom que le dossier source.
    Autrement dis si j'ai Dossier1 comme source et dedans sousdossier1 et sousdossier2 que j'ai 2 fichier texte dans sousdossier1 lors de ma copie j'obtiendrais en résultat Dossier1 avec dedans 2 fichier texte mais pas les 2 sousdossier.


    Je ne sais pas si je suis compréhensible ^^'

  13. #13
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Salut,

    Là j'arrive seulement à copier tous les fichiers que je met dans un dossier du meme nom que le dossier source.
    Autrement dis si j'ai Dossier1 comme source et dedans sousdossier1 et sousdossier2 que j'ai 2 fichier texte dans sousdossier1 lors de ma copie j'obtiendrais en résultat Dossier1 avec dedans 2 fichier texte mais pas les 2 sousdossier.
    Si le code te renvoie par exemple :

    C:\ Dossier1\sousdossier1\FichierTexte1.txt\FichierTexte2.txt
    C:\ Dossier1\sousdossier2

    et que le sousdossier2 est vide il est normal qu'il ne contienne rien à copier et que la copie obtenue se limite à FichierTexte1.txt et à FichierTexte2.txt.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  14. #14
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Oui mais ce que je veux dire c'est que au lieu de me crée Dossier1\Sousdossier1\FichierTexte1 & FichierTexte2 + dossier1\Sousdossier2\ (vide)
    (Ce que je voudrais donc)

    Cela crée juste Dossier1\FichierTexte1 & Fichiertexte2

    Tu vois ce que je veux dire ?

  15. #15
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Il y a une erreur dans mon message précédent :

    En toute logique il faut remplacer :
    C:\ Dossier1\sousdossier1\FichierTexte1.txt\FichierTexte2.txt
    C:\ Dossier1\sousdossier2
    par :
    C:\ Dossier1\sousdossier1\FichierTexte1.txt
    C:\ Dossier1\sousdossier1\FichierTexte2.txt
    C:\ Dossier1\sousdossier2
    en tous cas c'est ce que renvoie normalement le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.Bouton1Click(Sender : TObject);
    begin     // initialisation :
              SLDir:=TStringList.Create;
              // Execution :
              RecurseSubFolder('C:\Dossier1\');
              // Visu du résultat :
              ShowMessage(SLDir.Text);
              // libération-finalisation :
              SLDir.Free;
    end.
    Tu écris : Oui mais ce que je veux dire c'est que au lieu de me crée Dossier1\Sousdossier1\FichierTexte1 & FichierTexte2 + dossier1\Sousdossier2\ (vide)
    (Ce que je voudrais donc)
    ... quel est l'intérêt de vouloir obtenir 'dossier1\Sousdossier2\' s'il est vide et qu'il ny a donc rien dedans à y copier ??? ... (à moins de vouloir montrer qu'il est vide)

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  16. #16
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 15
    Points
    15
    Par défaut
    Comme prévu j'ai finis par m'y coller et j'ai procédé comme suit :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    procedure FindFiles(FilesList: TStringList; StartDir, FileMask: string);
    var
      SR: TSearchRec;
      DirList: TStringList;
      IsFound: boolean;
      i: integer;
      item: PElementListe;
    
    begin
    
      if StartDir[Length(StartDir)] <> '\' then
        StartDir := IncludeTrailingPathDelimiter(StartDir);
    
      { Build a list of the files in directory StartDir
        (not the directories!) }
    
      IsFound := FindFirst(StartDir + FileMask, faAnyFile - faDirectory, SR) = 0;
      while IsFound do
      begin
        new(item);
    
                test:=startdir;
    
       System.delete(test,1,length(dir))   ;
    
    
        item^.index := Liste.Count;
        item^.attribut := SR.Attr;
        item^.sourcefichier := StartDir + SR.Name;
        item^.destinationfichier := '';
        item^.datefichier := SR.Time;
        item^.taille := SR.Size;
        item^.isdone := false;
        item^.dossier:=test;
        Liste.Add(item);
    
    
        FilesList.Add(StartDir + SR.Name);
        IsFound := FindNext(SR) = 0;
      end;
      FindClose(SR);
    
      // Build a list of subdirectories
      DirList := TStringList.Create;
      IsFound := FindFirst(StartDir + '*.*', faAnyFile, SR) = 0;
      while IsFound do
      begin
        if ((SR.Attr and faDirectory) <> 0) and (SR.Name[1] <> '.') then
          DirList.Add(StartDir + SR.Name);
        IsFound := FindNext(SR) = 0;
      end;
      FindClose(SR);
    
      // Scan the list of subdirectories
      for i := 0 to DirList.Count - 1 do
        FindFiles(FilesList, DirList[i], FileMask);
    
      DirList.Free;
    end;
    Cette fonction permet de trouver entre autres tous les fichiers d'un repertoire y compris ceux qui sont dans des sous dossiers.
    J'ai modifier ma Tlist afin d'y mettre un element qui attribut le "sous-dossier" d'un fichier
    (représenter en gras)

    De cette façon lors de la copie je procède comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dest := TElementListe(Liste.Items[compteur]^).destinationfichier + TElementListe(Liste.Items[compteur]^).dossier +
        ExtractFileName(TElementListe(Liste.Items[compteur]^).sourcefichier);
    destination fichier = le dossier "parent"
    dossier = le sous dossier ou le chemin des sous dossier suivant le cas
    sourcefichier = le nom et l'extension

    Voilà problème résolu

  17. #17
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Vu, l'essentiel est que ça marche comme tu veux.

    Entre-temps, en me balladant sur le net j'ai trouvé ici : http://www.awitness.org/delphi_pasca...ew_delphi.html un Zip téléchargeable dont le code scanne le disque récursivement et affiche l'arborescence dans un Treview de Delphi comme le fait l'Explorateur Windows. Je l'ai testé par curiosité : il est bien.

    Pour le cas où cela t'intéresserait une autre fois.

    A+ .
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  18. #18
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 427
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @ Gilbert Geyer, a titre d'info, j'ai testé ton lien sur Seven 64bits et non fonctionnel !

    Cela peut être utile de le savoir !

    @+,

    Cincap

  19. #19
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Cincap ... a titre d'info, j'ai testé ton lien sur Seven 64bits et non fonctionnel !
    ... le lien précisait bien que le treeview_disk_scan.zip contient le code pour Delphi3/Delphi5.

    Pour ma part j'ai testé la version Delphi5 (32 bits) qui fonctionne correctement.

    En fait je n'en ai extrait que la function TForm1.BrowseForFolder : string; qui déclenche l'ouverture d'un Dialogue (API Windows) permettant de choisir dans une première arborescence du disque le dossier-racine à partir duquel on veut créer un Treeview de sous-dossiers et de leurs fichiers éventuellement.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  20. #20
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut ATTENTION à la récursivité en programmation !
    Salut,

    La récursivité c'est joli, mais ce n'est pas efficace en programmation.

    La récursivité est une base de la réflexion mathématique mais ça reste de la théorie. Cela peut parfois s'appliquer à la programmation afin d'obtenir du code élégant. Cependant il faut savoir que ce code ne sera jamais très performant. En effet, pour obtenir de meilleures performances, on commence souvent par dérécursifier les routines.

    Pour s'en convaincre, il suffit de comparer deux routines de tri QuickSort (l'une l'utilisant, l'autre pas).

    On en trouve hélas plein sur Internet qui utilisent la récursivité. Pourtant QuickSort est le type même du tri qu'on met en oeuvre quand on veut des perfs. Et c'est donc justement le cas où la récursivité est à exclure !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 6
    Dernier message: 05/07/2020, 10h39
  2. [Tableaux] Lister tous les répertoires dans une liste
    Par cdevl32 dans le forum Langage
    Réponses: 10
    Dernier message: 01/03/2008, 18h20
  3. Liste de tous les évènements possibles sur un formulaire
    Par Zhebulon dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 18/06/2007, 08h54
  4. Cherche un Listing de tous les mots Français et Anglais
    Par Fabien Celaia dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 11/04/2007, 17h35
  5. [JDOM] Recpérer une liste de tous les éléments d'un fichier XML
    Par adilo dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 30/08/2006, 10h15

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