Précédent   Forum du club des développeurs et IT Pro > C et C++ > Outils pour C & C++ > C++Builder
C++Builder Environnement de développement RAD C++Builder. Avant de poster -> F.A.Q C++Builder, Sources C++Builder
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 05/12/2012, 14h41   #1
Tenebrous
Candidat au titre de Membre du Club
 
Homme
Inscription : septembre 2009
Messages : 55
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : Belgique

Informations forums :
Inscription : septembre 2009
Messages : 55
Points : 14
Points : 14
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.
Tenebrous est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2012, 14h55   #2
ShaiLeTroll
Expert Confirmé Sénior
 
Avatar de ShaiLeTroll
 
Homme
Développeur C++\Delphi
Inscription : juillet 2006
Messages : 9 172
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France

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

Informations forums :
Inscription : juillet 2006
Messages : 9 172
Points : 13 204
Points : 13 204
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é !
ShaiLeTroll est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 09h34   #3
Tenebrous
Candidat au titre de Membre du Club
 
Homme
Inscription : septembre 2009
Messages : 55
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : Belgique

Informations forums :
Inscription : septembre 2009
Messages : 55
Points : 14
Points : 14
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.
Tenebrous est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 19h12   #4
Crayon
Membre Expert
 
Avatar de Crayon
 
Inscription : avril 2005
Messages : 1 612
Détails du profil
Informations personnelles :
Localisation : Autre

Informations forums :
Inscription : avril 2005
Messages : 1 612
Points : 1 796
Points : 1 796
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
Crayon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2012, 20h34   #5
Crayon
Membre Expert
 
Avatar de Crayon
 
Inscription : avril 2005
Messages : 1 612
Détails du profil
Informations personnelles :
Localisation : Autre

Informations forums :
Inscription : avril 2005
Messages : 1 612
Points : 1 796
Points : 1 796
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
Crayon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 11h35   #6
Tenebrous
Candidat au titre de Membre du Club
 
Homme
Inscription : septembre 2009
Messages : 55
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : Belgique

Informations forums :
Inscription : septembre 2009
Messages : 55
Points : 14
Points : 14
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.
Tenebrous est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 18h56   #7
Crayon
Membre Expert
 
Avatar de Crayon
 
Inscription : avril 2005
Messages : 1 612
Détails du profil
Informations personnelles :
Localisation : Autre

Informations forums :
Inscription : avril 2005
Messages : 1 612
Points : 1 796
Points : 1 796
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
Crayon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 15h13   #8
Tenebrous
Candidat au titre de Membre du Club
 
Homme
Inscription : septembre 2009
Messages : 55
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 22
Localisation : Belgique

Informations forums :
Inscription : septembre 2009
Messages : 55
Points : 14
Points : 14
Oui mais le problème vient justement du fait que le fichier n'est pas présent dans la version 5 de C++ Builder.
Tenebrous est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 16h47   #9
Crayon
Membre Expert
 
Avatar de Crayon
 
Inscription : avril 2005
Messages : 1 612
Détails du profil
Informations personnelles :
Localisation : Autre

Informations forums :
Inscription : avril 2005
Messages : 1 612
Points : 1 796
Points : 1 796
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:
Citation:
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
Crayon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 17h22   #10
yarp
Membre confirmé
 
Inscription : janvier 2003
Messages : 273
Détails du profil
Informations personnelles :
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : janvier 2003
Messages : 273
Points : 272
Points : 272
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.
yarp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h38.


 
 
 
 
Partenaires

Hébergement Web