Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Copiar directorios recursivamente con FileCopyEX (https://www.clubdelphi.com/foros/showthread.php?t=90202)

juank1971 25-04-2016 22:53:10

Copiar directorios recursivamente con FileCopyEX
 
Hola amigos este tema se ha tratado pero no veo claro hacer un progress con los directorios y el calculo de la taza de tranferencia me da dudoso, necesito hechen un vistazo a este codigo y me digan si lo ven correcto y que sugerencia me dan para hacer progress con los directorios.

esta funcion sacada de por aqui cerca :
Código Delphi [-]
procedure TForm1.CopyDirectory(Origen, Desti : string);//copia un directorio a otro recursivamente
var Files : integer; FOrigen, FDesti : string;
     ok    : boolean; Search : TSearchRec;
begin
 Files := FindFirst(Origen + '\*.*', faAnyFile, Search);
 while Files = 0 do
  begin
     if Search.Attr <> faDirectory then
      begin  //es un fichero
           FOrigen := Origen + '\' + Search.Name; FDesti := Desti + '\' + Search.Name;

           if not DirectoryExists(ExtractFilePath(FDesti)) then CreateDir(ExtractFilePath(FDesti));

           Folder.Caption := Origen; File.Caption := ExtractFileName(Search.Name);

           CopyFileEx(PWideChar(FOrigen), PWideChar(FDesti), @ProgressRoutine, nil, @Cancel, 0);
      end
     else
      begin  //es una carpeta
           if (Search.Name <> '.') and (Search.Name <> '..') then
            begin
                 ok := CreateDir(Desti + '\' + Search.Name);
                 if  ok then // llamada recursiva
                  CopyDirectory(Origen+'\'+Search.Name,Desti+'\'+Search.Name);
            end;
      end;
     Files := FindNext(Search);
  end;
 FindClose(Search);
end;

y este es el retorno de la función CopyFileEx como un CallBack que dicho sea de paso no lo dejan claro en casi ningún foro, siempre dicen que llamen la función pero casi nadie pone el ejemplo completo de ambos códigos el de la llamada de la función y el callback y realmente me volvo loco varias semanas sin saber que este simple @ProgressRoutine se declaraba normalmente como otra función cualquiera, a veces creemos que los demás saben cómo se debe hacer y omitimos cosas esenciales.

Entonces como cuando tenemos el fichero lo copiamos con CopyFileEx(PWideChar(FOrigen), PWideChar(FDesti), @ProgressRoutine, nil, @Cancel, 0);

pues un poquito arriba se define la famosa función fuera de la clase de la forma como:


Código Delphi [-]
function ProgressRoutine(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred: Int64; dwStreamNumber, dwCallbackReason, hSourceFile, hDestinationFile: Cardinal; lpData: Pointer): Cardinal; stdcall;
var Value: Cardinal;
    t : tTime; s:string; taza:real; ss,tt:Integer;
begin
  t :=  tiempo-time;    Application.ProcessMessages;

 case dwCallbackReason of
  CALLBACK_CHUNK_FINISHED :
  with Form1 do
   begin
     cxProgressBar1.Position := (TotalBytesTransferred * 100) div TotalFileSize; //progreso de la copia del fichero 
  
    
    ss:=FormatTimeToSeg(t);//funcion que lleva de horas,minutos y segundos todo a segundos

    tt:=Round((TotalFileSize*ss/TotalBytesTransferred));//Calcula el tiempo que se demora en copiar todo el fichero

    Ltaza.Caption  := FloatToStr(StreamBytesTransferred/ss);//calcula la taza de tranferencia o velocidad 

    tiemporestante.Caption := SegToFormatHour(tt) ;//convierte el tiempo que se va a demorar en copiar a Horas,minutos,segundos 
   end;
//  CALLBACK_STREAM_SWITCH: Form1.ProgressBar1.Max := 100;
 end;
 Result := PROGRESS_CONTINUE;
end;

La ayuda que necesito es poner un progress en los directorios aparte del que ya tengo en la copia del fichero, como calcular el máximo para el progress total de todos los directorios. Otra cosa que necesito me hagan alguna sugerencia en el cálculo de la velocidad de trasferencia ya que me varía mucho del inicio de la copia a cuando esta más de la mitad de copiar el fichero , por eso no veo clara la fórmula que hice. Otra cosa como pondríamos hilos en este rollo recursivo, lo imagino y se me enreda mas el cordel.

Gracias por su tiempo


La franja horaria es GMT +2. Ahora son las 07:43:59.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi