FAQ DelphiConsultez toutes les FAQ

Nombre d'auteurs : 123, nombre de questions : 919, dernière mise à jour : 14 juin 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 fichiersFichier (17)
précédent sommaire suivant
 

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;

Mis à jour le 18 octobre 2013 hachesse

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');
Il est préférable de s'assurer que le ficher existe avant de le renommer et de contrôler que le fichier a bien été renommé.

Mis à jour le 18 octobre 2013 hachesse

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;
Si toutefois vous souhaitez gérer les possibles erreurs lors de la copie, vous pouvez utiliser la fonction CopyFile :
Code : Sélectionner tout
CopyFile(NomDeFichierExistant, NouveauNomDeFichier : String; EchecSiExiste: BOOL): BOOL;
Le paramètre "EchecSiExiste" indique comment procéder si un fichier portant le même nom que le paramètre "NouveauNomDeFichier" existe déjà.
  • 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);

Mis à jour le 21 janvier 2014 Laurent Dardenne

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;
Avec cette fonction vous pouvez également déplacer un fichier sur un volume différent.
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.

Mis à jour le 21 janvier 2014 Laurent Dardenne

Lien MSDN : fonction MoveFileEx

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;

Mis à jour le 18 octobre 2013 Smortex

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;

Mis à jour le 18 octobre 2013 delphi-fan

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;

Mis à jour le 18 octobre 2013 delphi-fan

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

Mis à jour le 18 octobre 2013 Nono40

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;
Fonctionne avec Delphi2 et supérieur. Pour Delphi 1, il faut modifier le code en remplaçant Info.FindData.cFileName par Info.Name. D'autre part, à partir de Delphi 6, un message d'avertissement est indiqué pour l'utilisation de FindData. Pour désactiver cet avertissement, il faut ajouter la directive {$WARN SYMBOL_PLATFORM OFF} en début de code.

Mis à jour le 18 octobre 2013 Nono40

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;
Pour obtenir le résultat inverse (nom court à partir du nom long), vous pouvez utiliser la fonction ExtractShortPathName disponible dans l'unité SysUtils depuis Delphi 4.

Mis à jour le 18 octobre 2013 Pierre Castelain

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;
Cette fonction étant souvent utilisée après avoir tenté d'ouvrir un fichier par ShellExecute, voici une fonction réalisant les deux appels en série (si nécessaire bien sûr) :
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;

Mis à jour le 21 janvier 2014 Pierre Castelain

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;
La chaîne renvoyée est égale à FileName si FileName ne contient pas de lecteur et de répertoire.

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;
Partie extension

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;
La chaîne renvoyée comprend le point séparant le nom et l'extension (.TXT). Cette chaîne est vide si le nom du fichier ne comprend pas d'extension.

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;

Mis à jour le 21 janvier 2014 Laurent Dardenne

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;
Vous pouvez utiliser les valeurs suivantes :
  1. faReadOnly : Fichiers en lecture seule
  2. faHidden : Fichiers cachés
  3. faSysFile : Fichiers système
  4. faVolumeID : Fichiers d'identification de volume
  5. faDirectory : Fichiers répertoire
  6. faArchive : Fichiers archive
  7. faAnyFile : Tout fichier

Mis à jour le 21 janvier 2014 Laurent Dardenne

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;

Mis à jour le 21 janvier 2014 bvsud Reisubar

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;

Mis à jour le 21 janvier 2014 Reisubar

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

Mis à jour le 25 janvier 2014 Nono40

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;

Mis à jour le 20 avril 2014 Bestiol Gilbert Geyer TicTacToe

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.

 
Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -

Partenaire : Hébergement Web