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 :

[debutant]Comment récupérer tout les fichiers d'un répertoire?


Sujet :

Delphi

  1. #1
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 141
    Points : 43
    Points
    43
    Par défaut [debutant]Comment récupérer tout les fichiers d'un répertoire?
    Bonjour....

    Je suis dans un projet VCL et je souhaite récupérer dans une listBox tout les répertoires d'un répertoire donnée et dans une deuxieme listbox tout les fichiers de ce meme répertoire donnée...

    Est ce possible et si oui comment dois je m'y prendre?

    Merci d'avance...

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Regarde du côté des fonctions findFirst et findNext, et selon l'attribut tu pourras en déduire si c'est un fichier ou un directory

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var DirInfo: TSearchRec;
    begin
      if findFirst('*.*',faAnyFile,DirInfo) = 0
      then repeat
                if DirInfo.Attr and faDirectory = faDirectory
             then //c'est un directory ajout dans la listBox
                  else //c'est un fichier ajout dans la listBox
             until FindNext(DirInfo) = 0;
    end;
    Tu récupères le nom du fichier par dirInfo.Name.
    Regarde ensuite du côté des fonction ExtractFileName,ExtractFilePath... pour récupérer les informations contenues dans un nom de fichier (fileName,Path...)
    Donc regarde de près la définition de TSearchRec et tu connaîteras tout ce que tu peux récupérer (taille, date...)

    Attention, tout ce qui concerne les attributs de sécurité ACE, ne sont pas accessibles par cette méthode.

    Couplé à cela tu peux également récupérer les dates de création, modification et de derniers accés au fichier. C'est une QR de la FAQ dont voici le 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
    // Retourne les informations concernant les dates d'un fichier
    // Date création, modification et dernier accés
    function GetFileTimes(const FileName: string; var Created: TDateTime;
      var Accessed: TDateTime; var Modified: TDateTime): Boolean;
    var
      h: THandle;
      Info1, Info2, Info3: TFileTime;
      SysTimeStruct: SYSTEMTIME;
      TimeZoneInfo: TTimeZoneInformation;
      Bias: Double;
    begin
      Result := False;
      Bias   := 0;
      h      := FileOpen(FileName, fmOpenRead or fmShareDenyNone);
      if h > 0 then
      begin
        try
          if GetTimeZoneInformation(TimeZoneInfo) <> $FFFFFFFF then
            Bias := TimeZoneInfo.Bias / 1440; // 60x24
          GetFileTime(h, @Info1, @Info2, @Info3);
          if FileTimeToSystemTime(Info1, SysTimeStruct) then
            Created := SystemTimeToDateTime(SysTimeStruct) - Bias;
          if FileTimeToSystemTime(Info2, SysTimeStruct) then
            Accessed := SystemTimeToDateTime(SysTimeStruct) - Bias;
          if FileTimeToSystemTime(Info3, SysTimeStruct) then
            Modified := SystemTimeToDateTime(SysTimeStruct) - Bias;
          Result := True;
        finally
          FileClose(h);
        end;
      end;
    end;
    Par ailleurs, si tu désires effectuer un traitement sur tous les fichiers d'une arborescence, voici le code d'une déscente récursive. A adapter selon tes besoins, répertoire initial etc...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure lectureRecursive;
    var DirInfo: TSearchRec;
    begin
      if findFirst('*.*',faAnyFile,DirInfo) = 0
       then repeat
              if DirInfo.Attr and faDirectory = faDirectory
                then lectureRecursive
                else //Mon traitement sur fichier
              until FindNext(DirInfo) = 0;
    end;
    Cordialement

  3. #3
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut

    vous pouvez aussi regarder du coté des composant Liste de répertoires et Liste de fichiers (désolé si je ne souviens pas du nom exact des composants).

  4. #4
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 141
    Points : 43
    Points
    43
    Par défaut
    Et est ce que je peux connaitre tout les répertoire qui sont au niveau juste au dessus d'un répertoire donné....

  5. #5
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Il suffit d'utiliser un combiné entre la fonction chdir et ce que je t'ai donné plus haut soit findFirst et findNext en filtrant avec faDirectory

    Donc procedure à mettre en place
    - 1 chdir(le_répertoire_donné);
    - 2 chdir('..'); // pour remonter d'un niveau dans l'arborescence
    - 3 Faire un FindFirst/FindNext et en extraire la liste des répertoires

    Cordialement

  6. #6
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 141
    Points : 43
    Points
    43
    Par défaut
    Alors voila ce que je fais....

    Voici mon arborescence:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
               c:
               |
       ---------------     
      |                    |
     repertoire1      repertoire2
                                |
                        ------------
                       |                |
                 repertoire3    repertoire4
    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
     
    var
       TSR_RepertoireNiveau1   : TSearchRec;
       TSR_RepertoireNiveau2  : TSearchRec;
    begin
      If FindFirst('c:\'+'*.*',faDirectory,TSR_RepertoireNiveau1)=0 Then
       begin
         repeat
              ListBox1.Items.Add(TSR_RepertoireNiveau1.FindData.cFileName);
              If FindFirst('c:\'+TSR_RepertoireNiveau1.FindData.cFileName+'\'+'*.*',faDirectory,TSR_RepertoireNiveau2)=0 Then
                begin
                  repeat
                      ListBox2.Items.Add(TSR_RepertoireNiveau2.FindData.cFileName);
                  Until FindNext(TSR_RepertoireNiveau2)<>0;
                end;
                FindClose(TSR_RepertoireNiveau2);
         Until FindNext(TSR_RepertoireNiveau1)<>0;
       end;
       FindClose(TSR_RepertoireNiveau1);
    Et ca... ca ne marche pas au niveau de mon repertoireNiveau2 je récupere tout (niveau 1 +2)....

    Qu'est ce qu'il ne va pas dans mon code???

  7. #7
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Il faudrait que ta procédure soit récursive, ce serait plus simple à gérer.

  8. #8
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 141
    Points : 43
    Points
    43
    Par défaut
    Il faudrait que ta procédure soit récursive, ce serait plus simple à gérer.
    ???

  9. #9
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 141
    Points : 43
    Points
    43
    Par défaut
    Alors j'ai trouvé pourquoi je récupéré n'importe quoi...
    en faite mon arborescence est la suivante...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
               c:
               |
       ---------------     
      |                    |
     repertoire1      repertoire2
                                |
                        -------------------------------
                       |                |                         |
                 repertoire3    repertoire4               Mon programme
    En faite je fais la recherche de mes répertoire depuis mon programme et non depuis le c: (car apres je vais faire un exe et je ne veux pas de beugue )

    Mon programme et le suivant:

    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
     
    <div style="text-align: left;">var
       TSR_RepertoireNiveau1   : TSearchRec;
       TSR_RepertoireNiveau2  : TSearchRec;
    begin
      If FindFirst('.\.\'+'*.*',faDirectory,TSR_RepertoireNiveau1)=0 Then
       begin
         repeat
              ListBox1.Items.Add(TSR_RepertoireNiveau1.FindData.cFileName);
              If FindFirst('.\.\'+TSR_RepertoireNiveau1.FindData.cFileName+'\'+'*.*',faDirectory,TSR_RepertoireNiveau2)=0 Then
                begin
                  repeat
                      ListBox2.Items.Add(TSR_RepertoireNiveau2.FindData.cFileName);
                  Until FindNext(TSR_RepertoireNiveau2)<>0;
                end;
                FindClose(TSR_RepertoireNiveau2);
         Until FindNext(TSR_RepertoireNiveau1)<>0;
       end;
       FindClose(TSR_RepertoireNiveau1);</div>
    Or dans ma listBox1 il m'affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      .
      ..
      repertoire1
      repertoire2
    Le probleme c'est ces deux point récupéré au début je ne sais pas d'ou ils viennent.... (je pensé en fait que pour remonter d'un niveau dans une arborescence il fallait ecrire ".." mais ca marche pas j'ai du faire ".")

  10. #10
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078

  11. #11
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Citation Envoyé par Mickey.jet
    ???
    Une procédure (ou fonction) récursive est une procédure qui s'appelle elle-même.

    Exemple :

    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
     
    // Crée la liste des fichiers d'un répertoire
    // extensions doit être du style '.bmp;.jpg;.gif' (avec le . et séparées par un ;)
    // ou vide si toutes les extensions sont traitées
    procedure createFilesList(from: string; list: TStrings; sous_rep : boolean; masque, extensions : string);
    var
      sr: TSearchRec;
      ext : TStringList;
    begin
      // ajout du \ final si besoin
      if (from <> '') and (from[length(from)] <> '\') then
        from := from + '\';
     
      // on crée une liste des extensions souhaitées
      ext := TStringList.Create;
      ext.Delimiter := ';';
      ext.DelimitedText := extensions;
      try
        if FindFirst(from + masque, faAnyFile, sr) = 0 then
        begin
          repeat
            if (sr.Name <> '.') and (sr.Name <> '..') then
            begin
              // si le fichier fait partie de la liste des extensions autorisées
              if (ext.Count = 0) or (ext.IndexOf(ExtractFileExt(sr.Name)) > -1) then
                list.Add(from + sr.Name);
              if sous_rep and ((sr.Attr and faDirectory) <> 0) then
              begin
                createFilesList(from + sr.Name,list,true,masque,extensions);
              end;
            end;
          until FindNext(sr) <> 0;
          SysUtils.FindClose(sr);
        end;
      finally
        ext.Free;
      end;
    end;
    Bloon

  12. #12
    Membre du Club
    Inscrit en
    Avril 2005
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 141
    Points : 43
    Points
    43
    Par défaut
    Oui mais pourquoi cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (sr.Name <> '.') and (sr.Name <> '..') then
    Pourquoi il récupére systematiquement un '.' et un '..'???

  13. #13
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Citation Envoyé par Mickey.jet
    Oui mais pourquoi cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (sr.Name <> '.') and (sr.Name <> '..') then
    Pourquoi il récupére systematiquement un '.' et un '..'???
    Quand tu fais un dir en ligne de commande, tu récupère systématiquement un répertoire . (qui représente le répertoire courant) et un répertoire .. (qui représente le répertoire parent). Il est donc inutile de les traiter.

    Bloon

Discussions similaires

  1. Réponses: 5
    Dernier message: 24/06/2008, 13h07
  2. Comment récupérer toutes les valeurs dans :params avec form_tag ?
    Par Didier Pitre dans le forum Ruby on Rails
    Réponses: 0
    Dernier message: 17/04/2008, 10h33
  3. comment copier tout les fichier d'un répertoire?
    Par UnSofteuxAmateur dans le forum Windows Forms
    Réponses: 1
    Dernier message: 29/10/2007, 10h30
  4. Réponses: 4
    Dernier message: 24/09/2004, 10h17

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