Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    septembre 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : Belgique

    Informations forums :
    Inscription : septembre 2009
    Messages : 65
    Points : 16
    Points
    16

    Par défaut Lister contenu répertoire

    Bonjour,

    Je souhaite créer un petit programme me permettant de choisir un répertoire dont il faut lister le contenu (noms des fichiers dans un premier temps).
    Grâce à la FAQ, je me suis débrouillé et, en changeant un peu le code, j'y suis arrivé. Le programme me permet de spécifier le dossier à utiliser et me liste son contenu dans un fichier qu'il crée. Le soucis est que j'aimerais que cette liste soit ordonnée sur la date de création des fichiers, c'est-à-dire que le premier écrit dans le fichier devra être le fichier le plus vieux, et ainsi de suite jusqu'au plus récemment créé. Je n'ai pas trouvé comment faire, j'espère que vous pourrez me filer un coup de main.
    Voici mon code :

    Code :
    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
     
    void __fastcall TInterface::Button3Click(TObject *Sender)
    {
            if(SelectDirectory("Choose a directory", "D:\\Documents and Settings\\anonymous\\Bureau", directory))
                    logFileEdit->Text = directory;
    }
     
    void __fastcall TInterface::makeBinButtonClick(TObject *Sender)
    {
            if(directory == "")
                    Application->MessageBox("Choose a directory to analyse please", "ERROR", MB_OK);
            else
            {
                    AnsiString FilePath = logFileEdit->Text;
                    TStrings *ListeFichiers = new TStringList;
     
                    TSearchRec Infos_fichier;
                    if (!FindFirst(FilePath+"\\*.*", faAnyFile, Infos_fichier))
                    {
                            do
                            {
                                    ListeFichiers->Add(Infos_fichier.Name);
                            }
                            while(!FindNext(Infos_fichier));
                    }
                    FindClose(Infos_fichier);
     
                    if(ListeFichiers->Count > 2)
                    {
                            ListeFichiers->SaveToFile("D:\\Documents and Settings\\anonymous\\Bureau\\nameFile.txt");
                            Application->MessageBox("File created", "ERROR", MB_OK);
                    }
                    else
                            Application->MessageBox("There are no files in this directory", "ERROR", MB_OK);
            }
    }
    Merci d'avance.

  2. #2
    Expert Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 003
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 003
    Points : 12 789
    Points
    12 789

    Par défaut

    Utilise TSearchRec.Time, la fonction FileDateToDateTime va te le convertir au besoin, ajoute cette valeur via AddObject au lieu de Add
    Puis appel CustomSort avec une procédure utilisant Object comme critère de comparaison, la fonction CompareDateTime devrait aider à créer ta TStringListSortCompare

    Voir aussi FindData pour Windows, plus précis avec ftCreationTime, ftLastAccessTime et ftLastWriteTime
    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

    Halte à la ségrégation des Cinémas, VO sur Paris, VF en Banlieue, Abonnement résilié !

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    septembre 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : Belgique

    Informations forums :
    Inscription : septembre 2009
    Messages : 65
    Points : 16
    Points
    16

    Par défaut

    Merci pour tes indications, elles me sont utiles bien que je n'arrive toujours pas à mes fins.
    Je n'arrive pas à ajouter un TDateTime via la fonction AddObject de ma TStringList.

  4. #4
    Membre Expert Avatar de Crayon
    Inscrit en
    avril 2005
    Messages
    1 686
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : avril 2005
    Messages : 1 686
    Points : 1 777
    Points
    1 777

    Par défaut

    Citation Envoyé par Tenebrous Voir le message
    Je n'arrive pas à ajouter un TDateTime via la fonction AddObject de ma TStringList.
    Il suffit de caster ton TDateTime en (TObject*), non?
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  5. #5
    Membre Expert Avatar de Crayon
    Inscrit en
    avril 2005
    Messages
    1 686
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : avril 2005
    Messages : 1 686
    Points : 1 777
    Points
    1 777

    Par défaut

    Salut, j'ai fait un petit demo avec deux TDateTimePicker, le temps dans le premier est mis dans le deuxième en passant par un TStringList:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        TStrings *ListeFichiers = new TStringList;
     
        // Ajoute un TDateTime dans un TStringList
        TDateTime* LDateTime1 = new TDateTime(DateTimePicker1->DateTime);
        ListeFichiers->AddObject("Fichier1.txt", (TObject*)LDateTime1);
     
        // Lecture d'un TDateTime à partir d'un TStringList
        TDateTime* LDateTime2 = (TDateTime*)ListeFichiers->Objects[0];
        DateTimePicker2->DateTime = *LDateTime2;
     
        // Il ne faut pas oublier de supprimer les objets TDateTime allouer avec new
     
        delete ListeFichiers;
    Pour tester j'avais mis le code dans l'évènement DateTimePicker1Change.
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    septembre 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : Belgique

    Informations forums :
    Inscription : septembre 2009
    Messages : 65
    Points : 16
    Points
    16

    Par défaut

    Ok pour le cast, merci.
    Cependant, j'ai omis de préciser que je travaillais avec C++ Builder 5 et il semble que je n'ai pas accès à la fonction CompareDateTime.
    En gros, mes objets sont présents dans la liste, il ne me reste plus qu'à trouver un moyen de les trier sur la date.

  7. #7
    Membre Expert Avatar de Crayon
    Inscrit en
    avril 2005
    Messages
    1 686
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : avril 2005
    Messages : 1 686
    Points : 1 777
    Points
    1 777

    Par défaut

    Salut, est-ce que tu as essayer d'inclure DateUtils.hpp pour utiliser CompareDateTime?
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    septembre 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : Belgique

    Informations forums :
    Inscription : septembre 2009
    Messages : 65
    Points : 16
    Points
    16

    Par défaut

    Oui mais le problème vient justement du fait que le fichier n'est pas présent dans la version 5 de C++ Builder.

  9. #9
    Membre Expert Avatar de Crayon
    Inscrit en
    avril 2005
    Messages
    1 686
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : avril 2005
    Messages : 1 686
    Points : 1 777
    Points
    1 777

    Par défaut

    Salut, Indy possède aussi une fonction CompareDateTime, il suffit d'inclure IdGlobalProtocols.hpp:

    Prototype:
    Code :
    extern PACKAGE int __fastcall CompareDateTime(const System::TDateTime ADateTime1, const System::TDateTime ADateTime2);
    Description:
    The return value is less than 0 if ADateTime1 is less than ADateTime2, 0 if ADateTime1 equals ADateTime2, or greater than 0 if ADateTime1 is greater than ADateTime2.
    J'espère que celle-ci se trouve dans la version 5 de C++Builder, sinon il va falloir coder ta propre fonction.
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  10. #10
    Membre confirmé
    Profil pro Laurent
    Inscrit en
    janvier 2003
    Messages
    280
    Détails du profil
    Informations personnelles :
    Nom : Laurent
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : janvier 2003
    Messages : 280
    Points : 277
    Points
    277

    Par défaut

    Si ça n'existe pas dans CB5 -ce dont je doute car CB5 a un jeu de fonctions très riche, la fonction a peut être un nom différent.

    Perso, j'utilise les fonctions de l'API Windows pour ça:
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
    Certes pas avec un TDateTime (avec la structure FILETIME). Ce n'est pas aussi facile que d'appeler CompareDateTime, il faut appeler plusieurs fonctions.
    De mémoire (je n'ai pas le projet sous les yeux): FileTimeToSystemeTime, puis SystemTimeTo?, et enfin CompareFileTime.

    Donc fait une recherche sur :
    - conversion TDateTime vers FILETIME
    - TDateTime CompareFileTime
    Et tu devrais trouver une solution qui fonctionne avec CB5.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •