FAQ DelphiConsultez toutes les FAQ

Nombre d'auteurs : 123, nombre de questions : 920, dernière mise à jour : 8 novembre 2019  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.

Commentez


SommaireGestion des fichiersRépertoire (12)
précédent sommaire suivant
 

L'objet Application de l'unité Form contient un attribut ExeName : String; qui contient le nom de fichier de l'exécutable de l'application, y compris le chemin d'accès. Pour extraire uniquement le répertoire où se trouve notre programme, on utilisera la fonction ExtractFilePath(const FileName: String) : String; de l'unité SysUtils.

Code delphi : Sélectionner tout
Repertoire := ExtractFilePath(Application.ExeName);
Application.ExeName contient la même valeur que ParamStr(0).

Mis à jour le 18 octobre 2013 hachesse

On utilise la fonction CreateDir(const Dir : String) : Boolean; de l'unité SysUtils. Il est toutefois préférable de tester préalablement si le répertoire n'existe pas déjà. Il est aussi bien vu de vérifier qu'il n'y ait pas eu d'erreurs lors de la création du répertoire.

Exemple de l'aide en ligne de Delphi :

Code delphi : Sélectionner tout
1
2
3
4
5
begin 
  if not DirectoryExists('C:\temp') then 
  if not CreateDir('C:\temp') then 
    raise Exception.Create('Impossible de créer C:\temp'); 
end;

Mis à jour le 18 octobre 2013 hachesse

On utilise la fonction ForceDirectories (Dir : string) : Boolean de l'unité SysUtils.

ForceDirectories permet de créer un dossier et ses répertoires parents si nécessaire. Il n'est pas nécessaire de vérifier que le dossier n'existe pas avant d'appeler cette fonction, puisque cela se fait avant la création des répertoires.

Exemple de l'aide en ligne de Delphi :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
var 
  Dir: string; 
begin 
  Dir := 'C:\APPS\SALES\LOCAL'; 
  if ForceDirectories(Dir) then 
    Label1.Caption := Dir + ' a été créé' 
end;

Mis à jour le 18 octobre 2013 Smortex

Deux possibilités sont à envisager :

  • le répertoire est vide : l'utilisation de la fonction RemoveDir (const Dir : String) : Boolean suffit ;
  • le répertoire n'est pas vide : une solution consiste à utiliser l'API de l'unité ShellAPI :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
uses 
  ShellApi; 
  
function DelDir(Dir: String): Boolean; 
var fos: TSHFileOpStruct; 
begin 
  ZeroMemory(@fos, SizeOf(fos)); 
  with fos do begin 
    wFunc := FO_DELETE; 
    fFlags := FOF_SILENT or FOF_NOCONFIRMATION; 
    pFrom := PChar(Dir + #0); 
  end; 
  Result := (0=ShFileOperation(fos)); 
end;
Il est préférable de s'assurer que le répertoire existe avant de le supprimer.

Mis à jour le 18 octobre 2013 atlantis

La fonction RenameFile (constOldName, NewName : string) : Boolean de l'unité SysUtils permet de renommer les fichiers mais aussi les répertoires.

Code : Sélectionner tout
RenameFile('c:\tmp\', 'c:\tmp2\');
Il est préférable de s'assurer que le répertoire existe avant de le renommer et de contrôler que le répertoire a bien été renommé.

Mis à jour le 18 octobre 2013 hachesse

La fonction suivante utilise une expression régulière pour vérifier qu'une chaîne de caractères donnée est un nom de dossier valide sous Windows.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
uses 
{$if compilerversion >= 22.0} 
  RegularExpressionsCore; 
{$else} 
  PerlRegEx; (* http://www.regular-expressions.info/download/TPerlRegEx.zip *) 
{$ifend} 
  
function IsValidFolderName(const s: string): boolean; 
const 
  REGEX = '^[A-Za-z]:(\\|(\\(\.*[^\\/:*?"<>|.]+)+)+)$'; 
var 
  expr: TPerlRegEx; 
begin 
  expr := TPerlRegEx.Create; 
  expr.Subject := {$if compilerversion >= 22.0}s{$else}utf8string(s){$ifend}; 
  expr.RegEx := REGEX; 
  result := expr.Match; 
  expr.Free; 
end;

Si vous utilisez une version de Delphi antérieure à Delphi XE, vous devez vous procurer l'unité PerlRegEx.

Mis à jour le 9 décembre 2016 Roland Chastain

On utilise pour cela la fonction DirectoryExists(const Directory : String) : Boolean; de l'unité SysUtils.

Code delphi : Sélectionner tout
1
2
3
4
5
6
begin 
  if DirectoryExists('C:\MyDirectory\') then 
    { le répertoire existe } 
  else 
    { le répertoire n'existe pas } 
end;

Mis à jour le 18 octobre 2013 hachesse

La fonction SelectDirectory affiche l'explorateur des répertoires de Windows. Il faut ajouter FileCtrl dans la clause Uses. Cette fonction a deux format d'appel différents :

SelectDirectory (constCaption : string; constRoot : WideString; outDirectory : string) : Boolean;

Cette version permet de choisir le répertoire de départ de la recherche et le titre de la fenêtre.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
procedure TForm1.Button1Click(Sender: TObject);  
var  
  ChoixRepertoire : string;  
begin  
  If SelectDirectory('Choisissez le dossier d''installation','C:\TEMP\',ChoixRepertoire)  
    Then Label1.caption := ChoixRepertoire;  
end;

SelectDirectory (varDirectory : string; Options : TSelectDirOpts; HelpCtx : Longint) : Boolean;

Cette version permet de définir ce qu'il se passe si l'utilisateur choisit un répertoire inexistant.
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
procedure TForm1.Button1Click(Sender: TObject);  
var  
  ChoixRepertoire : string;  
begin  
  If SelectDirectory(ChoixRepertoire,[sdAllowCreate,sdPerformCreate,sdPrompt],0)  
    Then Label1.caption := ChoixRepertoire;  
end;
  • sdAllowCreate autorise la sélection d'un répertoire inexistant ;
  • sdPerformCreate autorise la boîte de dialogue à créer le répertoire ;
  • sdPrompt demande la confirmation en cas de création de répertoire.

Mis à jour le 18 octobre 2013 atlantis

Selon la version de Windows, le répertoire système n'est pas le même (System32 ou System). Pour retrouver ce répertoire, il suffit de le demander à Windows par le biais de la fonction GetSystemDirectory :

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
function SystemDirectory: String; 
const 
  dwLength: DWORD = 255; 
var 
  SystemDir: PChar; 
begin 
  GetMem(SystemDir, dwLength); 
  GetSystemDirectory(SystemDir, dwLength); 
  Result := String(SystemDir); 
  FreeMem(SystemDir, dwLength); 
end;

Mis à jour le 18 octobre 2013 atlantis

Selon la version, Windows est installé en standard soit dans le répertoire C:\WINDOWS, soit dans le répertoire C:\WINNT. Pour retrouver ce répertoire, il suffit de le demander à Windows par le biais de la fonction GetWindowsDirectory.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
function WindowsDirectory: String; 
const 
  dwLength: DWORD = 255; 
var 
  WindowsDir: PChar; 
begin 
  GetMem(WindowsDir, dwLength); 
  GetWindowsDirectory(WindowsDir, dwLength); 
  Result := String(WindowsDir); 
  FreeMem(WindowsDir, dwLength); 
end;

Mis à jour le 18 octobre 2013 atlantis

Dans l'API Windows, il existe la fonction SHGetFolderLocation qui permet de récupérer le chemin des répertoires spéciaux de Windows : Bureau, Menu Démarrer...

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
uses Shlobj; 
  
function SpecialFolder(Folder: Integer): String;  
var  
  SFolder : pItemIDList;  
  SpecialPath : Array[0..MAX_PATH] Of Char;  
begin  
  SHGetFolderLocation(Form.Handle, Folder, 0, SHGFP_TYPE_CURRENT, SFolder);  
  SHGetPathFromIDList(SFolder, SpecialPath);  
  Result := StrPas(SpecialPath);  
end; 
  
{ Application : } 
procedure TForm.MyButtonClick(Sender: TObject); 
begin 
  MyLabel.Caption := SpecialFolder(CSIDL_PERSONAL); 
end;
Selon le répertoire que vous souhaitez obtenir, vous devez utiliser l'une des variables suivantes :
  • CSIDL_APPDATA : Répertoire contenant les données des applications ;
  • CSIDL_COMMON_FAVORITES : Répertoire contenant les Favoris commun à tous les utilisateurs ;
  • CSIDL_COMMON_STARTMENU : Répertoire du menu Démarrer commun à tous les utilisateurs ;
  • CSIDL_COMMON_PROGRAMS : Répertoire Programmes du menu Démarrer commun à tous les utilisateurs ;
  • CSIDL_COMMON_STARTUP : Répertoire du groupe Démarrage du menu Démarrer commun à tous les utilisateurs ;
  • CSIDL_COMMON_DESKTOPDIRECTORY : Répertoire correspondant au bureau commun à tous les utilisateurs ;
  • CSIDL_COOKIES : Répertoire ou sont stockés les cookies d'Internet Explorer ;
  • CSIDL_DESKTOP : Répertoire correspondant à votre Bureau ;
  • CSIDL_DESKTOPDIRECTORY : Répertoire correspondant à votre Bureau ;
  • CSIDL_FAVORITES : Répertoire Favoris ;
  • CSIDL_FONTS : Répertoire dans lequel sont stockées toutes les polices de caractères ;
  • CSIDL_HISTORY : Répertoire contenant l'historique d'Internet Explorer ;
  • CSIDL_INTERNET_CACHE : Répertoire ou sont stockés les fichiers temporaires d'Internet Explorer ;
  • CSIDL_NETHOOD : Répertoire Voisinage Réseau ;
  • CSIDL_PERSONAL : Répertoire Mes Documents ;
  • CSIDL_PRINTHOOD : Répertoire de voisinage d'impression ;
  • CSIDL_PROGRAMS : Répertoire Programmes du menu Démarrer ;
  • CSIDL_RECENT : Répertoire dans lequel se trouvent les raccourcis vers les Fichiers récemment ouverts ;
  • CSIDL_SENDTO : Répertoire dans lequel se trouvent les raccourcis Envoyer vers ;
  • CSIDL_STARTMENU : Répertoire Menu Démarrer ;
  • CSIDL_STARTUP : Répertoire du groupe Démarrage du Menu Démarrer ;
  • CSIDL_TEMPLATES : Répertoire contenant les modèles de documents de Windows.

Mis à jour le 18 octobre 2013 atlantis free07

La fonction suivante vous permet de copier un répertoire :

Code Delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  
function CopyFolder(FromFld, ToFld: string): boolean;  
var fos: TSHFileopStruct;  
begin  
// il faut supprimer les antislashs de fin sinon vous aurez droit à un message d'erreur  
  FromFld := ExcludeTrailingPathDelimiter(Trim(FromFld));  
  ToFld := ExcludeTrailingPathDelimiter(Trim(ToFld));  
  
  FillChar(fos, SizeOf(fos),0);  
  with fos do  
  begin  
    wFunc := FO_COPY;  
    pFrom := PChar(FromFld+#0);  
    pTo   := PChar(ToFld+#0);  
    fFlags := FOF_SILENT or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR;  
  end;  
  Result := ShFileOperation(fos)=0;  
end;
L'appel à la fonction se fait simplement par :
Code Delphi : Sélectionner tout
1
2
3
4
  
if CopyFolder('d:\Repertoire01', 'c:\Repertoire02')then  
    ShowMessage('Copie effectuée avec succès') else  
    ShowMessage('Copie non effectuée');
La structure SHFILEOPSTRUCT est définie dans l'unité ShellAPI, donc il faudra rajouter celle-ci dans vos uses.

Mis à jour le 21 janvier 2014 delphichem Nono40 Vulcanos

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 © 2019 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.