FAQ DelphiConsultez toutes les FAQ
Nombre d'auteurs : 124, nombre de questions : 934, dernière mise à jour : 23 octobre 2024 Ajouter une question
Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums Delphi et Delphi et bases de données de www.developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous souhaitez y apporter des corrections ou la compléter, contactez un responsable (lien au bas de cette page).
Nous espérons que cette FAQ saura répondre à vos attentes. Nous vous en souhaitons une bonne lecture.
L'équipe Delphi de Developpez.com.
- Comment tester si un fichier existe ?
- Comment renommer un fichier ?
- Comment copier un fichier ?
- Comment déplacer un fichier ou un répertoire ?
- Comment créer un fichier et ses répertoires ?
- Comment envoyer un fichier à la corbeille ?
- Comment vider la corbeille ?
- Comment ouvrir un document ?
- Comment lister les fichiers d'un répertoire ?
- Comment obtenir le nom long d'un chemin ?
- Comment afficher le dialogue "Ouvrir avec..." ?
- Comment manipuler les différentes parties d'un nom de fichier ?
- Comment lire/modifier les attributs d'un fichier ?
- Comment récupérer la taille d'un fichier ?
- Comment récupérer les dates associées à un fichier ?
- Comment lister les fichiers de plusieurs sous-répertoires ?
- Comment récupérer la taille d'un fichier avec les fonctions de l'API ?
On utilise pour cela la fonction FileExists (const FileName : String) : Boolean de l'unité SysUtils.
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 | begin if FileExists('C:\MyDirectory\MyFile.txt') then { le fichier existe } else { le fichier n'existe pas} end; |
La fonction RenameFile (constOldName, NewName : string) : Boolean de l'unité SysUtils permet de renommer tout type de ficher.
Code delphi : | Sélectionner tout |
RenameFile('C:\MonFichier.txt', 'C:\MonTexte.txt');
Vous pouvez utiliser la fonction ShFileOperation qui permet, entre autres l'opération de copie de fichiers.
En cas d'erreur le système affichera une fenêtre de dialogue indiquant la cause probable de l'erreur.
Les flags FOF_xxx influencent l'opération, consulter l'aide en ligne pour plus de détails.
Code Delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function CopyFile(Source, Destination: String ) : boolean; var fos : TSHFileOpStruct; begin FillChar(fos, SizeOf(fos),0); with fos do begin wFunc := FO_COPY; pFrom := PChar(Source+#0); pTo := PChar(Destination+#0); fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT; end; result := (0 = ShFileOperation(fos)); end; |
Code : | Sélectionner tout |
CopyFile(NomDeFichierExistant, NouveauNomDeFichier : String; EchecSiExiste: BOOL): BOOL;
- Si ce paramètre vaut TRUE et qu'un fichier existe déjà, la fonction échoue et renvoie FALSE.
- Si ce paramètre vaut FALSE et qu'un fichier existe déjà, le fichier existant est écrasé, la fonction réussit et renvoie TRUE.
Code Delphi : | Sélectionner tout |
1 2 | Result := CopyFile(PChar(NomDeFichierExistant), PChar(NouveauNomDeFichier), False); |
Utiliser la function MoveFileEx :
Code : | Sélectionner tout |
MoveFileEx(ExistingFileName, NewFileName : PChar; Flags : DWord): Boolean;
Code Delphi : | Sélectionner tout |
1 2 3 4 5 6 | function MoveFile(FichierSource, FichierDestination: String; CommentDeplacerLeFichier: DWORD) : boolean; Begin Result := MoveFileEx(PChar(FichierSource), PChar(FichierDestination),MOVEFILE_COPY_ALLOWED); end; |
Les paramètres ExistingFileName et NewFileName référence un nom de fichier ou un nom de répertoire.
Voir l'aide en ligne pour le détail du paramètre Flags.
Il suffit pour cela de forcer la création du fichier et de l'arborescence avec la fonction ForceDirectories (Dir : String) : Boolean et d'éditer ce fichier avec ReWrite (F : FileFile,[...]) :
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | var F: TextFile; begin ForceDirectories('c:\PremierRep\DeuxRep\TroisRep'); AssignFile(F,'c:\PremierRep\DeuxRep\TroisRep\MonFichier.txt'); ReWrite(F); try { Code } finally CloseFile(F); end; end; |
L'usage classique de la fonction DeleteFile (dans FileIntf.pas) a pour effet de supprimer totalement un fichier. Mais on peut vouloir passer par la corbeille comme le fait l'explorateur Windows. C'est ce que fait le code ci-dessous.
Vous remarquerez l'ajout du caractère #0 à la fin du nom de fichier. Ainsi, après la conversion en PChar, pFrom contiendra le nom du fichier à supprimer suivi de deux caractères #0. Ces deux caractères sont imposés par la MSDN car FO_DELETE peut servir pour supprimer plusieurs fichiers à la fois. Chaque nom de fichier doit être séparé par un #0 et le dernier suivi par deux #0.
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | function DeleteFileToRecycleBin(AFileName : string ) : boolean; var fos : TSHFileOpStruct; begin FillChar(fos, SizeOf(fos),0); with fos do begin wFunc := FO_DELETE; pFrom := PChar(AFileName+#0); fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT; end; result := (0 = ShFileOperation(fos)); end; |
Pour vider la corbeille par code et sans confirmation, on peut utiliser la procédure suivante :
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function SHEmptyRecycleBin (Wnd : HWnd; LPCTSTR : PChar; DWORD : Word) : Integer; stdcall; const SHERB_NOCONFIRMATION = $00000001; SHERB_NOPROGRESSUI = $00000002; SHERB_NOSOUND = $00000004; Implementation {$R *.DFM} function SHEmptyRecycleBin; external 'SHELL32.DLL' name 'SHEmptyRecycleBinA'; procedure TForm1.EmptyBtnClick(Sender: TObject); begin SHEmptyRecycleBin(self.handle,'', SHERB_NOCONFIRMATION); end; |
Vous voulez ouvrir un fichier texte, un document Word, lire un fichier MP3 ou tout simplement afficher une page html. Alors il vous suffit d'utiliser la fonction suivante :
Code delphi : | Sélectionner tout |
ShellExecute(0,'OPEN','C:\Mes documents\mon rapport.doc', Nil, Nil, SW_SHOW);
Pour compiler la fonction ci-dessus, il faut ajouter ShellApi dans la clause Uses de l'unité contenant la fonction. Par exemple :
Code delphi : | Sélectionner tout |
uses [...] ,ShellApi;
Cette fonction permet d'ouvrir, n'importe quel type de document pourvu que Windows connaisse le programme à utiliser. Ce document peut être une adresse internet ou directement une application.
Exemples :
Code delphi : | Sélectionner tout |
1 2 3 4 5 | ShellExecute(0,'OPEN','C:\Mes documents\mon rapport.doc', Nil, Nil, SW_SHOW); ShellExecute(0,'OPEN','http://www.developpez.com', Nil, Nil, SW_SHOW); ShellExecute(0,'OPEN','C:\MaMusiqueBranchée.MP3', Nil, Nil, SW_SHOW); ShellExecute(0,'OPEN','mailto:Nono40@fr.st', Nil, Nil, SW_SHOW); ShellExecute(0,'OPEN','C:\projets\MonProg.exe', Nil, Nil, SW_SHOW); |
Cette méthode montre l'utilisation simple des fonctions FindFirst, FindNext et FindClose pour lister les fichiers et répertoires contenus dans un répertoire donné. L'exemple donné ici recherche les fichiers et sous-répertoires contenus dans le chemin indiqué dans Edit1. Les listes sont affichées respectivement dans ListBox1 et ListBox2.
Code delphi : | Sélectionner tout |
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 | procedure TForm1.Button1Click(Sender: TObject); Var Chemin : String; Info : TSearchRec; begin ListBox1.Items.Clear; ListBox2.Items.Clear; { Pour être sur que la barre oblique finisse le nom du chemin } Chemin := IncludeTrailingPathDelimiter(Edit1.Text); { Recherche de la première entrée du répertoire } If FindFirst(Chemin+'*.*',faAnyFile,Info)=0 Then Begin Repeat { Les fichiers sont affichés dans ListBox1 } { Les répertoires sont affichés dans ListBox2 } If Not((Info.Attr And faDirectory)=0) Then ListBox2.Items.Add(Info.FindData.cFileName) Else ListBox1.Items.Add(Info.FindData.cFileName) { Il faut ensuite rechercher l'entrée suivante } Until FindNext(Info)<>0; { Dans le cas ou une entrée au moins est trouvée il faut } { appeler FindClose pour libérer les ressources de la recherche } FindClose(Info); End; end; |
Mise à jour 06/02/2021, Gouyon
Applicable à partir des versions qui proposent l'unité IOUtils ou des versions proposant System.IOUtils (XE+)
Pour lister les fichiers d'un répertoire il suffit d'utiliser TDirectory qui est déclaré dans cette unité de la rtl.
Exemple liste tous les fichiers appartenant au répertoire d:\monrepertoire commençant par nav_ et ayant pour extension .xml
Code pascal : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | var Fichiers: TArray<string>; nomF: string; begin Fichiers := TDirectory.GetFiles('d:\monrepertoire','nav_*.xml'); for nomF in Fichiers do begin .........//traitement des fichiers end; |
Rapprochez-vous de la documentation de votre version pour d'autres informations sur cette unité évoluant régulièrement
Comment retrouver le nom long d'un chemin ou d'un fichier à partir de son nom court (8 caractères + extension au format DOS ou Windows 16 bits) ?
La fonction GetLongFilename retourne le nom long d'un chemin en utilisant le Shell. Si ce nom ne peut être obtenu, elle retourne le nom original passé en argument, ce qui permet de ne pas avoir besoin de vérifier qu'il s'agit bien d'un nom court avant l'appel.
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | uses ShlObj, Windows; function GetLongFilename(const ShortFilename: string): string; var desktop: IShellFolder; filename: Widestring; pchEaten: Cardinal; ppIdl: PItemIDList; pdwAttributes: Cardinal; buffer: array [0..MAX_PATH] of char; begin result:= ShortFilename; if SHGetDesktopFolder(desktop) = NOERROR then begin filename:= ShortFilename; { Conversion en WideString } if Desktop.ParseDisplayName(0, nil, PWideChar(filename), pchEaten, ppidl, pdwAttributes) = NOERROR then begin if SHGetPathFromIDList(ppidl, buffer) then result:= buffer; end; end; end; |
Il peut arriver que nous ayons besoin d'afficher le dialogue "Ouvrir avec..." qui est utilisé lorsque l'utilisateur tente d'exécuter un fichier dont l'extension ne correspond à aucune application.
Malheureusement, il semble que ce dialogue ne soit pas accessible à l'aide d'une fonction de l'API Windows classique. En fait, ce dialogue est implémenté dans shell32.dll et n'est utilisé que par le shell lui-même. Il est toutefois possible de l'appeler très simplement en utilisant ShellExecute.
Voici le code d'une procédure effectuant cette opération pour un nom de fichier passé en paramètre :
Code Delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | uses SysUtils, ShellAPI, Windows; procedure OpenWith(const Filename: string); { Appelle le dialogue "Ouvrir avec..." pour le fichier dont le nom est passé en argument. } begin ShellExecute(0, 'open', 'rundll32.exe', PChar('shell32.dll,OpenAs_RunDLL ' + Filename), PChar(ExtractFilePath(Filename)), SW_SHOWNORMAL); end; |
Code Delphi : | Sélectionner tout |
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 | uses SysUtils, ShellAPI, Windows; function OpenFile(const Filename: string; const Handle: THandle = 0): boolean; { Tente d'ouvrir le fichier dont le nom est passé en argument avec l'application associée à son extension. Si aucune application n'est associée à celle-ci, le dialogue "Ouvrir avec..." est appelé. } var errCode: Cardinal; filePath: string; begin { On stocke le chemin pour éviter de le décoder 2 fois } filePath:= ExtractFilePath(Filename); { Tentative d'ouverture de l'application associée } errCode:= ShellExecute(Handle, 'Open', PChar(Filename), '', PChar(filePath), SW_SHOWNORMAL); { Si la tentative a échoué avec le code SE_ERR_NOASSOC, c'est que l'extension n'est associée à aucune application } if errCode = SE_ERR_NOASSOCthen { Dans ce cas, on appelle le dialogue } errCode:= ShellExecute(0, 'open', 'rundll32.exe', PChar('shell32.dll,OpenAs_RunDLL ' + Filename), PChar(filePath), SW_SHOWNORMAL); { Si le code retourné par ShellExecute est supérieur à 32, alors l'opération a réussi, sinon c'est un code d'erreur } result:= errCode > 32; end; |
Partie Drive
La fonction ExtractFileDrive renvoie la partie lecteur de FileName.
Elle renvoie une chaîne contenant la partie 'lecteur' d'un chemin complet pour le fichier passé dans FileName.
Pour les noms de fichiers ayant des lettres d'unité, le résultat est de la forme '<lecteur>'.
Pour les noms de fichiers au format UNC, la chaîne est au format '\\<serveur>\<nom_partagé>'.
Si le chemin indiqué ne contient aucun de ces types de chemins, le résultat est une chaîne vide.
Partie path
La fonction ExtractFilePath extrait le lecteur et le répertoire d'un nom de fichier.
La chaîne renvoyée est composée des caractères de gauche de FileName, jusqu'aux deux points ou la barre oblique inverse qui séparent le chemin du nom et de l'extension.
Code Delphi : | Sélectionner tout |
1 2 3 4 5 6 7 | var ProgramPath : String; begin ProgramPath := ExtractFilePath(ParamStr(0)); // Récupére le path complet du programme ... end; |
La chaîne renvoyée est vide si FileName ne contient pas de partie lecteur et répertoire.
Partie nom et extension
La fonction ExtractFileName renvoie un chaîne en commençant par le premier caractère après les deux points ou la barre oblique inverse séparant le chemin du nom et de l'extension.
Code Delphi : | Sélectionner tout |
1 2 3 4 5 6 7 | var ProgramName : String; begin ProgramName := ExtractFileName(ParamStr(0)); // Récupére le nom du programme ... end; |
Partie nom
La procédure suivante permet de récupérer uniquement la partie nom d'un nom de fichier.
Code Delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | Function ExtractFileNameOnly(FileName:TFileName): TFileName; // renvoie la partie nom, d'un nom de fichier constitué d'un nom et d'une extension var ExtPart : TFileName; lgExt : Integer; begin ExtPart := ExtractFileExt(FileName); LgExt:=Length(ExtPart); Delete(FileName,Length(FileName)-lgExt+1,lgExt); Result:=FileName; end; |
La fonction ExtractFileExt extrait l'extension d'un nom de fichier donné. Par exemple, le code suivant renvoie l'extension du nom de fichier indiqué par une variable nommée MyFileName.
Code Delphi : | Sélectionner tout |
1 2 3 4 5 6 7 | var MyFileExtension : String; begin MyFileExtension := ExtractFileExt(MyFileName); ... End; |
Récupérer toutes les parties dans un enregistrement
La procedure ProcessPath découpe un nom de fichier en ses différentes parties : Drive, Path, Filename+extension
Code Delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | Type TFileNamePart = Record Drive : Char; DirPart, FilePartExt, FilePart, ExtPart : String; end; Procedure GetFilePart(FileName:TFileName; Var Part :TFileNamePart); // Décompose un nom de fichier existant dans un enregistrement begin FillChar(Part, SizeOf(Part),#0); If FileExists(FileName) then begin ProcessPath(FileName,Part.Drive,Part.DirPart,Part.FilePartExt); Part.ExtPart :=ExtractFileExt(Part.FilePartExt); // Extrait l'extension Part.FilePart:=ExtractFileNameOnly(Part.FilePartExt); // Extrait le nom uniquement end; end; |
La fonction FileGetAttr permet de récupérer les attributs d'un fichier. En cas d'échec elle renvoie la valeur -1.
La fonction FileSetAttr permet de modifier les attributs d'un fichier. Elle renvoie zéro si l'exécution de la fonction réussit. Sinon, cette valeur est un code d'erreur Windows.
Code Delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | var Attributs : Word; begin Attributs := FileGetAttr('C:\Temp\Test.txt'); if Attributs and faReadOnly = faReadOnly then begin // Modifie l'attribut ReadOnly FileSetAttr('C:\Temp\Test.txt', Attributs and not faReadOnly); end; end; |
- faReadOnly : Fichiers en lecture seule
- faHidden : Fichiers cachés
- faSysFile : Fichiers système
- faVolumeID : Fichiers d'identification de volume
- faDirectory : Fichiers répertoire
- faArchive : Fichiers archive
- faAnyFile : Tout fichier
Vous pouvez utiliser la fonction suivante qui renvoie une valeur de type int64.
Code Delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | function TForm1.GetFileSize(const APath: string): int64; var Sr : TSearchRec; begin if FindFirst(APath,faAnyFile,Sr)=0 then try Result := Int64(Sr.FindData.nFileSizeHigh) shl 32 + Sr.FindData.nFileSizeLow; finally FindClose(Sr); end else Result := -1; end; |
L'API GetFileTime permet de récupérer les dates de création, de dernier accès, et de modification d'un fichier. Voilà une fonction permettant d'exploiter son résultat :
Code Delphi : | Sélectionner tout |
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 | function GetFileTimes(const FileName: string; var Created: TDateTime; var Accessed: TDateTime; var Modified: TDateTime): Boolean; var h: THandle; Info1, Info2, Info3: TFileTime; SysTimeStruct: SYSTEMTIME; TimeZoneInfo: TTimeZoneInformation; Bias: Double; begin Result := False; Bias := 0; h := FileOpen(FileName, fmOpenRead or fmShareDenyNone); if h > 0 then begin try if GetTimeZoneInformation(TimeZoneInfo) <> $FFFFFFFF then Bias := TimeZoneInfo.Bias / 1440; // 60x24 GetFileTime(h, @Info1, @Info2, @Info3); if FileTimeToSystemTime(Info1, SysTimeStruct) then Created := SystemTimeToDateTime(SysTimeStruct) - Bias; if FileTimeToSystemTime(Info2, SysTimeStruct) then Accessed := SystemTimeToDateTime(SysTimeStruct) - Bias; if FileTimeToSystemTime(Info3, SysTimeStruct) then Modified := SystemTimeToDateTime(SysTimeStruct) - Bias; Result := True; finally FileClose(h); end; end; end; |
Pour lister les fichiers d'un sous-répertoire, nous pouvons utiliser les fonctions FindFirst, FindNext et FindClose en récursif. Ces méthodes utilisent la structure TSearchRec qui permet de spécifier le type de fichiers à rechercher (répertoires, fichiers "normaux").
Un exemple d'utilisation de ces fonctions est disponible à cette page : Utilisation des procédures FindFirst, FindNext et FindClose
La fonction suivante nous permet de récupérer la taille d'un fichier en utilisant la fonction GetFileSize de l'API Windows :
Code Delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | function TailleFichier(Fichier: String): Int64; var hFile: THandle; HiSize: DWord; begin Result := 0; hFile := CreateFile(pAnsiChar(Fichier), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0); if hFile <> INVALID_HANDLE_VALUE then begin Result := GetFileSize(hFile, @HiSize ); Result := Result + Int64( HiSize ) shl 32; FileClose(hFile); end; end; |
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.