unit copiarf;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  EditBtn;

type

  { TForm1 }

  TForm1 = class(TForm)
    btnCopiar: TButton;
    cbFecha: TCheckBox;
    edCopiarDe: TFileNameEdit;
    lblCopiarA: TLabel;
    lblCopiarDe: TLabel;
    procedure btnCopiarClick(Sender: TObject);
    procedure edCopiarDeAcceptFileName(Sender: TObject; var Value: String);
  private
    Origen: string;
    Destino: string;
    procedure CopiarFichero(aOrigen, aDestino: string; CopiarFecha: boolean);

  end;

var
  Form1: TForm1;


implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.btnCopiarClick(Sender: TObject);
var anexar: string;
begin
	CopiarFichero(Origen, Destino, cbFecha.Checked);
	btnCopiar.Enabled:=False;
	edCopiarDe.Text:= EmptyStr;
	case cbFecha.Checked of
		False: anexar := ' copiado con la fecha actual';
		True: anexar := ' copiado con la fecha original';
	end;
	lblCopiarA.Caption:= Destino + anexar;
end;


procedure TForm1.edCopiarDeAcceptFileName(Sender: TObject; var Value: String);
var ruta, fNombre: string;
begin
  if (Value = EmptyStr) then Exit;
  ruta := ExtractFilePath(Value);
  fNombre:= ExtractFileName(Value);
  Destino:= ruta + 'Copia de ' + fNombre;
  case FileExistsUTF8(Destino) of
       False: begin
                   lblCopiarA.Caption := 'El fichero se copiará en: '+ Destino;
                   btnCopiar.Enabled:= True;
                   Origen:= Value;
              end;
       True : case QuestionDlg('¡Cuidado!', Destino + ' ya existe' +sLineBreak+
                   '¿Desea  reescribirlo?', mtWarning,  [mrYes,'Copiar', mrNo,
                   'Cancelar'],0) of
                   mrYes: begin
                            lblCopiarA.Caption := 'El fichero se copiará en:  '  + Destino;
                            btnCopiar.Enabled:= True;
                            Origen:= Value;
                          end;
                   else begin
                          Value:= EmptyStr;
                          btnCopiar.Enabled:= False;
                          Origen:= EmptyStr;
                          Destino:= EmptyStr;
                        end;
              end;
  end;
end;


procedure TForm1.CopiarFichero(aOrigen, aDestino: string;
  CopiarFecha: boolean);
var src: TFileStream = nil;
    dest: TFileStream = nil;
begin
     if SameText(aOrigen, aDestino) then Exit;
     src := TFileStream.Create(UTF8ToSys(aOrigen), fmOpenRead);
     try
        dest := TFileStream.Create(UTF8ToSys(aDestino),
        fmOpenWrite or fmCreate);
        try
           dest.CopyFrom(src, src.Size);
           if CopiarFecha  then
              FileSetDate(dest.Handle, FileGetDate(src.Handle));
        finally
          dest.Free;
        end
     finally
       src.Free;
     end;
end;

end.

