Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-04-2016
juank1971 juank1971 is offline
Miembro
 
Registrado: feb 2008
Posts: 230
Poder: 17
juank1971 Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Copiar directorios completos macu1975 API de Windows 9 27-12-2011 23:32:29
como buscar ficheros recursivamente kenychy C++ Builder 11 14-12-2010 17:47:12
Copiar estructura de directorios a un TTreeView metalfox6383 Varios 2 09-11-2009 16:49:26
puedo copiar directorios con subdirectorios? manolop Varios 3 27-03-2008 12:17:03
Copiar archivos, directorios y subdirectorios metalfox6383 Varios 3 23-04-2006 20:40:18


La franja horaria es GMT +2. Ahora son las 10:42:57.


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
Copyright 1996-2007 Club Delphi