Bonjour,
Selon vous, quel est le meilleur code pour copier le contenu d'un dossier vers un autre ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
 
// Copie un dossier
function CopierDossier(Source, Destination: String;
  Erreur: Boolean = True; LectureSeul: Boolean = True;
  Ecraser: Boolean = True): Boolean;
var
  FichierRech: TSearchRec;
  Attributes, NewAttributes: Word;
begin
  // Vérifie que les chaines finissent bien par un slash
  Source      := IncludeTrailingPathDelimiter(Source);
  Destination := IncludeTrailingPathDelimiter(Destination);
  Result      := True;
 
  // Recherche le premier fichier
  if SysUtils.FindFirst(Source + '*.*', faAnyFile, FichierRech) = 0 then
  begin
    repeat
      // Si il s'agit d'un fichier
      if (FichierRech.Attr and faDirectory) = 0 then
      begin
        // Vérifie si le fichier n'existe pas déjà
        if not Ecraser then
          if FileExists(Destination + FichierRech.Name) then
            Continue;
 
        // Copie le fichier
        if not CopyFile(PChar(Source + FichierRech.Name),
          PChar(Destination + FichierRech.Name), False) then
        begin
          // Si l'affichage des erreurs est demandé
          if Erreur then
          begin
            MessageDlg('Erreur d''E/S'#13#10#13#10
              + 'Erreur lors de la copie d''un fichier'#13#10#13#10
              + 'Le fichier :'#13#10
              + QuotedStr(Source + FichierRech.Name) + #13#10
              + ' n''a pas pu être copié dans le dossier :'#13#10
              + QuotedStr(Destination), mtWarning, 0);
          end;
          Result := False;
          Exit;
        end;
      end
      // Si il s'agit d'un dossier
      else
        // Si il ne s'agit pas du dossier racine
        if (FichierRech.Name <> '.') and (FichierRech.Name <> '..') then
        begin
          // Créer le dossier
          if not(SysUtils.ForceDirectories(Destination + FichierRech.Name)) then
          begin
            if Erreur then
            begin
              MessageDlg('Erreur d''E/S'#13#10#13#10
                + 'Erreur lors de la création d''un dossier'#13#10#13#10
                + 'Le dossier ' + QuotedStr(Destination + FichierRech.Name)
                + ' n''a pas pu être crée.', mtWarning, 0);
            end;
            Result := False;
            Exit;
          end;
 
          CopierDossier(Source + FichierRech.Name, Destination + FichierRech.Name);
        end;
 
        // Si on doit enlever les lectures seul
        if not(LectureSeul) then
        begin
          Attributes := FileGetAttr(Destination + FichierRech.Name);
 
          // Si le fichier est en lecture seul
          if (Attributes and SysUtils.faReadOnly) = faReadOnly then
          begin
            // Retire la lecture seul
            NewAttributes := Attributes;
            NewAttributes := NewAttributes and not SysUtils.faReadOnly;
            FileSetAttr(Destination + FichierRech.Name, NewAttributes);
          end;
        end;
 
      // Évite le plantage sous Windows Vista
      Application.ProcessMessages;
    until SysUtils.FindNext(FichierRech) <> 0;
    // Arrête la recherche
    SysUtils.FindClose(FichierRech);
  end;
end;
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
// Copie un dossier
function CopierDossier(Source, Destination: String;
  Erreur: Boolean = True; LectureSeul: Boolean = True;
  Ecraser: Boolean = True): Boolean;
var
  fos: TSHFileOpStruct;
begin
  // Vérifie que les chaines ne finissent pas par un slash
  Source      := IncludeTrailingPathDelimiter(Source) + '*';
  Destination := ExcludeTrailingPathDelimiter(Destination);
 
  ZeroMemory(@fos, SizeOf(fos));
  with fos do
  begin
    wFunc   := FO_COPY;
    pFrom   := PChar(Source + #0);
    pTo     := PChar(Destination + #0);
    if Erreur then
      fFlags  := FOF_SILENT or FOF_NOCONFIRMMKDIR
    else
      fFlags  := FOF_SILENT or FOF_NOCONFIRMMKDIR or FOF_NOERRORUI;
 
    if Ecraser then
      fFlags  := fFlags or FOF_NOCONFIRMATION;
  end;
  Result := (0 = ShFileOperation(fos));
end;
Merci et bonne journée