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);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 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 if (Search.Name <> '.') and (Search.Name <> '..') then
begin
ok := CreateDir(Desti + '\' + Search.Name);
if ok then 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;
ss:=FormatTimeToSeg(t);
tt:=Round((TotalFileSize*ss/TotalBytesTransferred));
Ltaza.Caption := FloatToStr(StreamBytesTransferred/ss);
tiemporestante.Caption := SegToFormatHour(tt) ; end;
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