Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

Vous n'avez pas encore de compte Developpez.com ? L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Developpez.com

C++

Choisissez la catégorie, puis la rubrique :

logo
Sommaire > Gestion des fichiers > Fichiers
        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écursive ?
        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 ?



Comme obtenir le répertoire d'un fichier ?
Créé le 01/09/2004[haut]
auteur : Geronimo
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.

AnsiString Directory;
if (OpenDialog1->Execute())
{
  Directory = ExtractFilePath(FileName);
  //... utilisation du répertoire
}

Comment obtenir l'extension d'un fichier ?
Créé le 01/09/2004[haut]
auteur : Geronimo
Pour obtenir l'extension d'un fichier, il faut faire appel à la fonction ExtractFileExt.

AnsiString ExtensionApplication = ExtractFileExt(Application->ExeName); // = ".EXE"
Attention, l'extension peut être rendue en majuscules. Pour la convertir en minuscules, utilisez la méthode LowerCase.

AnsiString ExtensionApplication = ExtractFileExt(Application->ExeName).LowerCase(); // = ".exe"

Comment obtenir la taille d'un fichier ?
Créé le 01/09/2004[haut]
auteur : 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 :

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

Comment obtenir la date de modification d'un fichier ?
Créé le 01/09/2004[haut]
auteur : Geronimo
Pour obtenir la date de modification d'un fichier, il faut utiliser la fonction FileAge :

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 :

AnsiString DateTimeStr = DateTimeToStr(FileDateToDateTime(FileAge(FileName)));

Comment changer l'extension d'un fichier ?
Créé le 01/09/2004[haut]
auteur : Geronimo
Pour changer l'extension d'un fichier, il existe une fonction ChangeFileExt, déclarée dans l'unité SysUtils.

#include <SysUtils.hpp>
//...
// Change l'extension.txt en.dat
ChangeFileExt("fichier.txt", ".dat");

Comment copier un fichier ?
Créé le 01/09/2004[haut]
auteur : 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 :

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.


Comment déplacer un fichier ?
Mise à jour le 25/04/2005[haut]
auteur : 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 :

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.

lien : faq Comment déplacer un répertoire ?
lien : faq Comment convertir une chaîne AnsiString en une chaîne C, tableau de caractères à zéro terminal ?

Comment savoir si un fichier existe ?
Créé le 01/09/2004[haut]
auteur : Geronimo
Utilisez la fonction FileExists.

if (FileExists("c:\\windows\\mon_programme.ini"))
{
 //... utilisation de "mon_programme.ini"
}
Cette fonction retourne true si le fichier passé en argument existe.


Comment lister les fichiers d'un répertoire ?
Créé le 01/09/2004[haut]
auteur : Geronimo
Pour lister les fichiers d'un répertoire, nous allons faire appel aux fonctions FindFirst, FindNext et FindClose ainsi qu'à la structure TSearchRec.

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 :

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

Comment lister les fichiers d'un répertoire de manière récursive ?
Créé le 22/11/2010[haut]
auteur : pottiez
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.

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.


Comment ouvrir plusieurs fichiers avec une OpenDialog ?
Créé le 01/09/2004[haut]
auteur : Geronimo
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 :

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.


Comment renommer un fichier ?
Créé le 25/04/2005[haut]
auteur : Neo41
Vous pouvez utiliser la fonction RenameFile qui est également valable pour les répertoires.

bool __fastcall RenameFile(const AnsiString OldName, const AnsiString NewName);
Exemple:
 
AnsiString  OldName = "C:\\Temp\\AncienFichier.txt", NewName = "C:\\Temp\\NouveauFichier.txt";
if(RenameFile(OldName, NewName) == true)
{
    //Fichier renommé avec succès
}
else
{
    //Problème
}
lien : faq Comment renommer un répertoire ?

Comment envoyer un fichier à la corbeille ?
Créé le 25/04/2005[haut]
auteur : 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:

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

Comment créer un fichier et ses répertoires?
Créé le 21/06/2006[haut]
auteur : 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 :

ForceDirectories("c:\\tmp1\\tmp2\\tmp3\\tmp4\\");
TFileStream * file = new TFileStream("c:\\tmp1\\tmp2\\tmp3\\tmp4\\test.txt",fmCreate);
file->Write("Test",4);
delete file;
lien : faq Comment créer un chemin complet en une seule fois

Comment obtenir la taille, dates et attributs d'un fichier ?
Créé le 06/12/2006[haut]
auteur : Dure_Limite
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 :
Renseignement de la structure

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.
Pour connaître la taille du fichier

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.
Les attributs

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.
Et les différentes dates

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


Consultez les autres F.A.Q.


Valid XHTML 1.0 TransitionalValid CSS!

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 © 2009 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni 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.

Contacter le responsable de la rubrique C++

Partenaire : Hébergement Web