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

Langage Delphi Discussion :

[D7] Liste des fichiers d'un répertoire


Sujet :

Langage Delphi

  1. #1
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 367
    Points : 3 140
    Points
    3 140
    Par défaut [D7] Liste des fichiers d'un répertoire
    Bonjour,

    pour lister les fichiers d'un répertoire j'utilise la procédure de la FAQ :

    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
    { ===================================================================== }
    Procedure TF_Bilan.ChargerFichiers ;
    Var Chemin : String;
        Info   : TSearchRec;
    begin
      ListBox1.Items.Clear;
      ListBox2.Items.Clear;
      Chemin := IncludeTrailingPathDelimiter(RepBilans);
      If FindFirst(Chemin+'*.*',faAnyFile,Info)=0 Then
      Begin
        Repeat
          { Les fichiers sont affichés dans ListBox1 }
          { Les répertoires sont affichés dans ListBox2 }
          If Not((Info.Attr And faDirectory)=0)
              Then ListBox2.Items.Add(Info.FindData.cFileName)
              Else ListBox1.Items.Add(Info.FindData.cFileName)
        Until FindNext(Info)<>0;
        FindClose(Info);
      End;
    end;
    { ===================================================================== }
    Est il possible de trier facilement les fichiers pour afficher en premier les fichiers les plus récents. Actuellement je pense qu'ils sont à la fin, mais peut être pas tout le temps ? sinon il suffirait simplement d'inverser la liste. Mais est ce sûr ?

    Autrement dit : dans quel ordre FindFirst et FindNext trouvent ils les fichiers dans le répertoire ?

    A+
    Charly

  2. #2
    Membre habitué
    Homme Profil pro
    libre
    Inscrit en
    Mai 2024
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Mai 2024
    Messages : 105
    Points : 194
    Points
    194
    Par défaut
    Avec une proche naïve mais efficace: Time est un entier de 32bit donc on peut le convertir en hex et apres on place cette chaine avant le nom du fichier pour effectuer un simple tri alpha


    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
    Var Chemin : String;
        Info   : TSearchRec;
        I: integer;
    begin
      ListBox1.Items.BeginUpdate;
      ListBox1.Items.Clear;
      ListBox1.Sorted := False;
      Chemin := IncludeTrailingPathDelimiter(RepBilans);
      If FindFirst(Chemin+'*.*',faAnyFile,Info)=0 Then
      Begin
        Repeat
          { Les fichiers sont affichés dans ListBox1 }
          { Les répertoires sont affichés dans ListBox2 }
          If  ((Info.Attr And faDirectory)=0) Then
              ListBox1.Items.Add( Format('%.8x%s',
                [$ffffffff - Info.Time ,Info.FindData.cFileName ]) );
        Until FindNext(Info)<>0;
        FindClose(Info);
      End;
      ListBox1.Sorted := True;
      with ListBox1 do
       for I := 0 to Items.Count-1 do
        Items[I] := Copy(Items[I], 9, MAXINT);
      ListBox1.Items.EndUpdate;
    end;

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 367
    Points : 3 140
    Points
    3 140
    Par défaut
    Bonjour Volid,

    oui, c'est une bonne idée. J'avais bien pensé à utiliser info.time, mais pas comme ça.

    Merci
    A+
    Charly

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 535
    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 535
    Points : 25 086
    Points
    25 086
    Par défaut
    Pour un serveur FTP, je l'ai codé ainsi :https://www.developpez.net/forums/d2.../#post11714935

    En D7 tu n'as pas de publicTDictionary

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          TFileDateList = class(System.Generics.Collections.TDictionary<TFileName, TDateTime>);
    Mais la TStringList accepte des Objects, ont peut donc écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TFileDateListItem = class(TObject)
      FileName: string;
      DateTime; TDateTime;
    ...
    ...
    TFileDateList = TStringList (OwnsObjects)
    Tu peux ainsi utiliser CustomSort et trier en fonction du Objects et non en fonction du texte
    Cela évite ensuite de devoir retire le préfixe
    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

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 535
    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 535
    Points : 25 086
    Points
    25 086
    Par défaut
    Une version ultra proprette via Objects
    En plus on peut garder l'information de la date dans la ListBox et l'afficher

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        ListBox1: TListBox;
        Label1: TLabel;
        procedure Button1Click(Sender: TObject);
        procedure ListBox1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    uses System.DateUtils;
     
    {$R *.dfm}
     
     
    type
      TDateTimeObject = class(TObject)
      private
        FFileName: string;
        FDateTime: TDateTime;
      public
        constructor Create(ASearchRec: TSearchRec);
     
        property FileName: string read FFileName;
        property DateTime: TDateTime read FDateTime;
      end;
     
    function DateTimeObjectStringListCompare(List: TStringList; Index1, Index2: Integer): Integer;
    begin
      // plus récent au plus ancien
      Result := Trunc(MSecsPerDay * (TDateTimeObject(List.Objects[Index2]).DateTime - TDateTimeObject(List.Objects[Index1]).DateTime));
    end;
     
     
    procedure TForm1.Button1Click(Sender: TObject);
    Var Chemin : String;
        Info   : TSearchRec;
        I: integer;
        Files: TStringList;
    begin
      Files := TStringList.Create();
      try
        Chemin := IncludeTrailingPathDelimiter('C:\DEV\Misc\Forum\Files\Find');
        If FindFirst(Chemin+'*.*',faAnyFile,Info)=0 Then
        try
          repeat
            If  ((Info.Attr And faDirectory)=0) Then
               Files.AddObject(Info.Name, TDateTimeObject.Create(Info));
     
          until FindNext(Info)<>0;
        finally
          FindClose(Info);
        end;
        Files.CustomSort(DateTimeObjectStringListCompare);
     
        ListBox1.Items.BeginUpdate;
        for I := 0 to ListBox1.Items.Count - 1 do
          ListBox1.Items.Objects[I].Free();
        ListBox1.Items.Clear;
        ListBox1.Items.AddStrings(Files);
        ListBox1.Items.EndUpdate;
      finally
        Files.Free();
      end;
    end;
     
    { TDateTimeObject }
     
    constructor TDateTimeObject.Create(ASearchRec: TSearchRec);
    var
      LocalFileTime: TFileTime;
      SystemTime: TSystemTime;
    begin
      FFileName := ASearchRec.Name;
     
      FileTimeToLocalFileTime(ASearchRec.FindData.ftLastWriteTime, LocalFileTime);
      FileTimeToSystemTime(LocalFileTime, SystemTime);
      FDateTime := SystemTimeToDateTime(SystemTime);
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    var
      I: integer;
    begin
      for I := 0 to ListBox1.Items.Count - 1 do
        ListBox1.Items.Objects[I].Free();
      ListBox1.Items.Clear;
    end;
     
    procedure TForm1.ListBox1Click(Sender: TObject);
    begin
      if ListBox1.ItemIndex >= 0 then
        with TDateTimeObject(ListBox1.Items.Objects[ListBox1.ItemIndex]) do
          Label1.Caption := Format('%s - %s', [FileName, DateTimeToStr(DateTime)])
      else
        Label1.Caption := '';
    end;
     
    end.
    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

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 535
    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 535
    Points : 25 086
    Points
    25 086
    Par défaut
    Une version qui se base sur le Objects[] qui contient un pointeur qui est un emplacement 32bits sur D7 suffisant pour stocker le Time du TSearchRec, fonctionnel mais ne pourra pas être migré en 64Bits

    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
    60
    61
    62
    63
    64
    65
    66
     
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        ListBox1: TListBox;
        Label1: TLabel;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    uses System.DateUtils;
     
    {$R *.dfm}
     
    function DateTimeAsPointerStringListCompare(List: TStringList; Index1, Index2: Integer): Integer;
    begin
      Result := Integer(List.Objects[Index2]) - Integer(List.Objects[Index1]); // plus récent au plus ancien
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    Var Chemin : String;
        Info   : TSearchRec;
        I: integer;
        Files: TStringList;
    begin
      Files := TStringList.Create();
      try
        Chemin := IncludeTrailingPathDelimiter('C:\DEV\Misc\Forum\Files\Find');
        If FindFirst(Chemin+'*.*',faAnyFile,Info)=0 Then
        try
          repeat
            If  ((Info.Attr And faDirectory)=0) Then
               Files.AddObject(Info.Name, Pointer(Info.Time)); // Tricherie faire croire que le Time est un pointeur, c'est faux, une bidouille connue en D7
     
          until FindNext(Info)<>0;
        finally
          FindClose(Info);
        end;
        Files.CustomSort(DateTimeAsPointerStringListCompare);
     
        ListBox1.Items.BeginUpdate;
        ListBox1.Items.Clear;
        ListBox1.Items.AddStrings(Files);
        ListBox1.Items.EndUpdate;
      finally
        Files.Free();
      end;
    end;
     
    end.
    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 expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 367
    Points : 3 140
    Points
    3 140
    Par défaut
    Merci Shai pour toutes ces possibilités que je vais tester

    Bonne soirée
    A+
    Charly

  8. #8
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 367
    Points : 3 140
    Points
    3 140
    Par défaut
    Finalement, j'ai pris la solution de Volid

    Merci à tous les 2

    A+
    Charly

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 27/10/2005, 22h38
  2. [Delphi 2005] Comment parcourir la liste des fichiers ?
    Par babyface dans le forum Langage
    Réponses: 2
    Dernier message: 30/06/2005, 11h01
  3. Réponses: 7
    Dernier message: 19/09/2004, 22h01
  4. liste des fichiers d'un répertoire
    Par am dans le forum C
    Réponses: 3
    Dernier message: 04/08/2003, 17h03
  5. [Kylix] Liste des fichiers d'un répertoire
    Par Houben Jacques dans le forum EDI
    Réponses: 3
    Dernier message: 30/11/2002, 21h14

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