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