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


SommaireGestion des fichiersFichiers (15)
précédent sommaire suivant
 

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 
}

Mis à jour le 1er septembre 2004 Geronimo

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"
Attention, l'extension peut être rendue en majuscules. Pour la convertir en minuscules, utilisez la méthode LowerCase.

Code c++ : Sélectionner tout
AnsiString ExtensionApplication = ExtractFileExt(Application->ExeName).LowerCase(); // = ".exe"

Mis à jour le 1er septembre 2004 Geronimo

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);

Mis à jour le 1er septembre 2004 Geronimo

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);
La fonction FileAge retourne un entier. Pour obtenir un objet DateTime, utilisez la fonction FileDateToDateTime. A partir de cet objet DateTime, vous pouvez obtenir une chaîne contenant les dates et heures de modification :

Code c++ : Sélectionner tout
AnsiString DateTimeStr = DateTimeToStr(FileDateToDateTime(FileAge(FileName)));

Mis à jour le 1er septembre 2004 Geronimo

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");

Mis à jour le 1er septembre 2004 Geronimo

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"); 
    } 
  } 
}
Cette fonction copie le fichier si l'utilisateur valide les boîtes de dialogue. La fonction prend pour argument deux chaînes à zéro-terminal (source et destination) et un booléen qui indique si la fonction doit écraser un fichier déjà existant : true, la fonction n'écrase pas, false, la fonction écrase le fichier. La fonction retourne 0 si elle échoue d'où notre test pour afficher un dialogue si la copie n'a pas eu lieu.

Mis à jour le 1er septembre 2004 Geronimo

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"); 
    } 
  } 
}
La fonction MoveFile échoue si le fichier destination existe déjà. Remarquez également que cette fonction prend pour arguments des chaînes C à zéro terminal, d'où l'appel de la méthode c_str() qui fournit une chaîne à zéro terminal à partir d'une chaîne AnsiString.

Mis à jour le 1er septembre 2004 Geronimo

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" 
}
Cette fonction retourne true si le fichier passé en argument existe.

Mis à jour le 1er septembre 2004 Geronimo

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); 
}
Voici donc notre méthode. Les paramètres qui doivent lui être passés sont respectivement FilePath, le répertoire dans lequel il faut faire la recherche, Extensions, la liste des extensions à recenser et enfin, ListeFichiers, un objet de type TStrings dans lequel on récupère la liste des fichiers.

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; 
}

Mis à jour le 1er septembre 2004 Geronimo

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); 
}
Voici donc notre méthode. Les paramètres qui doivent lui être passés sont respectivement listFile, dans lequel on récupère la liste des fichiers, directory, le répertoire dans lequel il faut faire la recherche, filtre, filtre de l'extension de fichier à trouver.

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.

Mis à jour le 21 novembre 2010 pottiez

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]); 
  } 
}
Le membre Files de OpenDialog1 contient la liste des fichiers sélectionnés. Il suffit donc de parcourir cette liste et d'ouvrir chaque fichier. Nous faisons appel pour cela à une méthode Ouvrir, que vous pouvez écrire pour votre programme.

Mis à jour le 1er septembre 2004 Geronimo

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);
Exemple:

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 
}

Mis à jour le 25 avril 2005 Neo41

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);

Mis à jour le 25 avril 2005 Neo41

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;

Mis à jour le 21 juin 2006 Neo41

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 
}
Il ne nous reste plus qu'à exploiter les valeurs de la structure qui nous intéressent.

Code c++ : Sélectionner tout
1
2
DWORD Taille_PoidsFort     = InfoFichier.nFileSizeHigh; 
DWORD Taille_PoidsFaible   = InfoFichier.nFileSizeLow;
Note : Si la taille du fichier est inférieure à 4Go, la variable "Taille_PoidsFort" est à 0.

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;
Note: La liste complète des attributs se trouve dans l'aide de WIN32_FILE_ATTRIBUTE_DATA.

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 
);

Mis à jour le 6 décembre 2006 Dure_Limite

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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 © 2020 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.