| 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);
}
|
|
| auteur : Geronimo | Pour obtenir l'extension d'un fichier, il faut faire appel à la fonction ExtractFileExt.
AnsiString ExtensionApplication = ExtractFileExt (Application- > ExeName);
|
Attention, l'extension peut être rendue en majuscules. Pour la convertir en minuscules, utilisez la méthode LowerCase.
AnsiString ExtensionApplication = ExtractFileExt (Application- > ExeName).LowerCase ();
|
|
| 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 :
int FichierHandle = FileOpen (Fichier, fmOpenRead);
Label1- > Caption = FormatFloat (" ### ### ### Ko " , FileSeek (FichierHandle, 0 , 2 ));
FileClose (FichierHandle);
|
|
| 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)));
|
|
| auteur : Geronimo |
Pour changer l'extension d'un fichier, il existe une fonction ChangeFileExt, déclarée dans l'unité SysUtils.
# include <SysUtils.hpp>
ChangeFileExt (" fichier.txt " , " .dat " );
|
|
| 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.
|
| 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 : Comment déplacer un répertoire ?
lien : Comment convertir une chaîne AnsiString en une chaîne C, tableau de caractères à zéro terminal ?
|
| auteur : Geronimo | Utilisez la fonction FileExists.
if (FileExists (" c:\\windows\\mon_programme.ini " ))
{
}
|
Cette fonction retourne true si le fichier passé en argument existe.
|
| 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;
Extensions- > Add (" .cpp " );
Extensions- > Add (" .h " );
Search (ExtractFilePath (Application- > ExeName), Extensions, ListBox1- > Items);
delete Extensions;
}
|
|
| 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.
|
| 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.
|
| 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 )
{
}
else
{
}
|
|
lien : Comment renommer un répertoire ?
|
| 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);
|
|
| 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 : Comment créer un chemin complet en une seule fois
|
| 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 ;
}
|
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;
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
);
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
);
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.
|
|