FAQ C++ BuilderConsultez toutes les FAQ
Nombre d'auteurs : 60, nombre de questions : 670, dernière mise à jour : 21 novembre 2010 Ajouter une question
Cette F.A.Q. a été réalisée à partir des questions fréquemment posées sur le forum C++ Builder de developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette F.A.Q. ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette F.A.Q. ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, contactez pottiez
Nous espérons que cette F.A.Q. saura répondre à un maximum de vos questions. Nous vous souhaitons une bonne lecture.
L'équipe C++ Builder de Developpez.
Commentez cette FAQ : Commentez
- Comme obtenir le répertoire d'un fichier ?
- Comment obtenir l'extension d'un fichier ?
- Comment obtenir la taille d'un fichier ?
- Comment obtenir la date de modification d'un fichier ?
- Comment changer l'extension d'un fichier ?
- Comment copier un fichier ?
- Comment déplacer un fichier ?
- Comment savoir si un fichier existe ?
- Comment lister les fichiers d'un répertoire ?
- Comment lister les fichiers d'un répertoire de manière récurcive ?
- Comment ouvrir plusieurs fichiers avec une OpenDialog ?
- Comment renommer un fichier ?
- Comment envoyer un fichier à la corbeille ?
- Comment créer un fichier et ses répertoires?
- Comment obtenir la taille, dates et attributs d'un fichier ?
Pour obtenir le répertoire dans lequel est situé un fichier, utilisez la fonction ExtractFilePath. L'exemple suivant trouve le répertoire dans lequel est situé un fichier sélectionné dans une boîte de dialogue d'ouverture. Placez donc une OpenDialog sur votre fiche.
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 | AnsiString Directory; if (OpenDialog1->Execute()) { Directory = ExtractFilePath(FileName); //... utilisation du répertoire } |
Pour obtenir l'extension d'un fichier, il faut faire appel à la fonction ExtractFileExt.
Code c++ : | Sélectionner tout |
AnsiString ExtensionApplication = ExtractFileExt(Application->ExeName); // = ".EXE"
Code c++ : | Sélectionner tout |
AnsiString ExtensionApplication = ExtractFileExt(Application->ExeName).LowerCase(); // = ".exe"
Pour obtenir la taille d'un fichier, nous faisons appel à la fonction FileSeek. Le code suivant montre comment on récupère cette taille dans une chaîne et comment on la formate pour qu'elle soit facilement lisible par l'utilisateur :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 | // ouverture du fichier en lecture int FichierHandle = FileOpen(Fichier, fmOpenRead); // FileSeek se déplace à 0 octets de la fin du fichier (2 représente la fin du fichier). // on formate la chaîne (# représente un chiffre) Label1->Caption = FormatFloat("### ### ### Ko", FileSeek(FichierHandle, 0, 2)); // on germe le fichier FileClose(FichierHandle); |
Pour obtenir la date de modification d'un fichier, il faut utiliser la fonction FileAge :
Code c++ : | Sélectionner tout |
1 2 3 4 5 | AnsiString FileName; //... FileName =... //... int Date = FileAge(FileName); |
Code c++ : | Sélectionner tout |
AnsiString DateTimeStr = DateTimeToStr(FileDateToDateTime(FileAge(FileName)));
Pour changer l'extension d'un fichier, il existe une fonction ChangeFileExt, déclarée dans l'unité SysUtils.
Code c++ : | Sélectionner tout |
1 2 3 4 | #include <SysUtils.hpp> //... // Change l'extension.txt en.dat ChangeFileExt("fichier.txt", ".dat"); |
Utilisez la fonction CopyFile. Le code ci-dessous permet à l'utilisateur de choisir un fichier source et de choisir sous quel nouveau nom il souhaite le copier.
Placez sur votre fiche un OpenDialog et un SaveDialog :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | if (OpenDialog1->Execute()) { if (SaveDialog1->Execute()) { if (!CopyFile(OpenDialog1->FileName.c_str(), SaveDialog1->FileName.c_str(), true)) { ShowMessage("Impossible de copier"); } } } |
Pour déplacer un fichier, utilisez la fonction MoveFile. Voici le code permettant de déplacer un fichier, après demande du fichier d'origine et destination grâce à un TOpenDialog et un TSaveDialog :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | if (OpenDialog1->Execute()) { if (SaveDialog1->Execute()) { if (!MoveFile(OpenDialog1->FileName.c_str(), SaveDialog1->FileName.c_str())) { ShowMessage("Impossible de déplacer"); } } } |
Utilisez la fonction FileExists.
Code c++ : | Sélectionner tout |
1 2 3 4 | if (FileExists("c:\\windows\\mon_programme.ini")) { //... utilisation de "mon_programme.ini" } |
Pour lister les fichiers d'un répertoire, nous allons faire appel aux fonctions FindFirst, FindNext et FindClose ainsi qu'à la structure TSearchRec.
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | void TForm1::Search(AnsiString FilePath, TStringList * Extensions, TStrings * ListeFichiers) { TSearchRec Infos_fichier; if (!FindFirst(FilePath+"*.*", faAnyFile, Infos_fichier)) do { for (int i = 0 ; i < Extensions->Count ; i++) { if (ExtractFileExt(Infos_fichier.Name).LowerCase() == Extensions->Strings[i].LowerCase()) { ListeFichiers->Add(ExpandFileName(Infos_fichier.Name)); } } } while(!FindNext(Infos_fichier)); FindClose(Infos_fichier); } |
La méthode crée une structure Infos_fichier qui permettra à la fonction FindFirst de stocker des informations sur les fichiers trouvés. Regardez l'aide sur FindFirst pour avoir plus de précisions sur celle-ci. Sachez simplement qu'elle attend en premier argument le répertoire de recherche, en second argument le type de fichiers à rechercher et enfin, la structure dans laquelle elle va stocker ses données. Cette fonction retourne 0 si elle trouve un fichier. Dans ce cas, on commence la boucle do...while. C'est la fonction FindNext qui prend le relais, FindFirst ne servant que pour la première fois.
Ensuite, on parcourt la liste des extensions et on regarde si l'extension du fichier trouvé SRec.Name correspond à une de la liste, dans ce cas, on l'ajoute.
Enfin, on libère la mémoire allouée dans la structure avec FindClose.
Cette méthode peut être utilisée de la manière suivante. Placez une ListBox sur votre fiche :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | void __fastcall TForm1::Button1Click(TObject *Sender) { TStringList *Extensions = new TStringList; // On construit la liste des extensions Extensions->Add(".cpp"); Extensions->Add(".h"); // Appel à notre méthode, avec pour liste des fichiers, les items de la ListBox. Search(ExtractFilePath(Application->ExeName), Extensions, ListBox1->Items); delete Extensions; } |
Pour lister les fichiers d'un répertoire et de ses sous-répertoires, nous allons faire appel aux fonctions FindFirst, FindNext et FindClose ainsi qu'à la structure TSearchRec.
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | void Search(std::list<std::string>& listFile, std::string directory, std::string filtre) { TSearchRect file; int retour ; if(directory[directory.length()-1] != '\\') directory += "\\"; directory += filtre; retour = FindFirst(directory.c_str(),0,file); while(retour == 0) { if((file.Attr & faDirectory) != 0) { Search(listFile,file.Name,filtre); }else{ listFile.push_back(file.Name.c_str()); } retour = FindNext(file); } FindClose(file); } |
La méthode crée une structure Infos_fichier qui permettra à la fonction FindFirst de stocker des informations sur les fichiers trouvés. Regardez l'aide sur FindFirst pour avoir plus de précisions sur celle-ci. Sachez simplement qu'elle attend en premier argument le répertoire de recherche, en deuxième argument le type de fichiers à rechercher et enfin, la structure dans laquelle elle va stocker ses données. Cette fonction retourne 0 si elle trouve un fichier. Dans ce cas, on commence la boucle do...while. C'est la fonction FindNext qui prend le relais, FindFirst ne servant que pour la première fois.
Pour chaque fichier trouvé, on regarde si c'est un répértoire ou un fichier, si c'est un fichier on l'ajoute à la liste, si c'est un répertoire, on rappelle la méthode pour aller tester les fichiers de ce répertoire.
Enfin, on libère la mémoire allouée dans la structure avec FindClose.
Sélectionnez la boîte de dialogue d'ouverture. Dans sa propriété Options, positionnez ofAllowMultiSelect à true. Ensuite, là où vous souhaitez ouvrir les fichiers, placez le code suivant :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 | if (OpenDialog1->Execute()) { for (int i=0; i<OpenDialog1->Files->Count; i++) { Ouvrir(OpenDialog1->Files->Strings[i]); } } |
Vous pouvez utiliser la fonction RenameFile qui est également valable pour les répertoires.
Code c++ : | Sélectionner tout |
bool __fastcall RenameFile(const AnsiString OldName, const AnsiString NewName);
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | AnsiString OldName = "C:\\Temp\\AncienFichier.txt", NewName = "C:\\Temp\\NouveauFichier.txt"; if(RenameFile(OldName, NewName) == true) { //Fichier renommé avec succès } else { //Problème } |
Si vous voulez avoir la possibilité de récupérer un fichier après l'avoir supprimé, il ne faut pas utiliser la fonction DeleteFile, cette dernière supprimant définitivement le fichier. Pour réaliser ceci pour vous pouvez utiliser SHFileOperation (valable également pour les répertoires) avec le flag FOF_ALLOWUNDO.
Exemple:
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 | SHFILEOPSTRUCT stFileOp; ZeroMemory(&stFileOp, sizeof(stFileOp)); stFileOp.wFunc = FO_DELETE; stFileOp.fFlags = FOF_ALLOWUNDO; stFileOp.hwnd = Application->Handle; stFileOp.pFrom = "C:\\Temp\\Fichier.txt\0"; SHFileOperation(&stFileOp); |
Tout d'abord il faut forcer la création du chemin d'accès du fichier, et ensuite créer le fichier lui même. Les fonctions à utiliser sont ForceDirectories, puis toute fonction permettant de créer le fichier, comme le montre le code suivant :
Code c++ : | Sélectionner tout |
1 2 3 4 | ForceDirectories("c:\\tmp1\\tmp2\\tmp3\\tmp4\\"); TFileStream * file = new TFileStream("c:\\tmp1\\tmp2\\tmp3\\tmp4\\test.txt",fmCreate); file->Write("Test",4); delete file; |
Pour obtenir quelques informations sur un fichier, on peut se servir de la structure WIN32_FILE_ATTRIBUTE_DATA qui est renseignée par la fonction GetFileAttributesEx.
Cette structure est composée de :
- La taille du fichier (non significatif pour un dossier) ;
- Les attributs ;
- Les dates : de création, de dernier accès, et d'enregistrement.
Exemple d'utilisation :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 | String PathNomExt = "C:\\WINDOWS\\SYSTEM32\\CALC.EXE"; WIN32_FILE_ATTRIBUTE_DATA InfoFichier; ZeroMemory (&InfoFichier, sizeof(WIN32_FILE_ATTRIBUTE_DATA)); if ( !GetFileAttributesEx( PathNomExt.c_str(), GetFileExInfoStandard, &InfoFichier )) { return; // Erreur } |
Code c++ : | Sélectionner tout |
1 2 | DWORD Taille_PoidsFort = InfoFichier.nFileSizeHigh; DWORD Taille_PoidsFaible = InfoFichier.nFileSizeLow; |
Code c++ : | Sélectionner tout |
1 2 3 4 | bool Archive = InfoFichier.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE; bool LectureSeule = InfoFichier.dwFileAttributes & FILE_ATTRIBUTE_READONLY; bool Compresse = InfoFichier.dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED; bool Cache = InfoFichier.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN; |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | SYSTEMTIME St; String Creation, DernierAcces, Enregistrement; // Date de création du fichier : FileTimeToSystemTime( &InfoFichier.ftCreationTime, &St); Creation.sprintf("Création : %02d/%02d/%d à %02dh%02d:%02d", St.wDay, St.wMonth, St.wYear, St.wHour, St.wMinute, St.wSecond ); // Date du dernier accès : FileTimeToSystemTime( &InfoFichier.ftLastAccessTime, &St); DernierAcces.sprintf("Dernier accès : %02d/%02d/%d à %02dh%02d:%02d", St.wDay, St.wMonth, St.wYear, St.wHour, St.wMinute, St.wSecond ); // Date d'enregistrement : FileTimeToSystemTime( &InfoFichier.ftLastWriteTime, &St); Enregistrement.sprintf("Modifié : %02d/%02d/%d à %02dh%02d:%02d", St.wDay, St.wMonth, St.wYear, St.wHour, St.wMinute, St.wSecond ); |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.