PDA

Ver la Versión Completa : como copar un dirctorio con el progressbar1


kurono
17-01-2008, 06:48:05
hola de nuevo amigo ya se como copiar un diretorio pero como ponerle un progressbar1 a la oprecion de copiado a qui le muestro el codigo y me gustaria q me dijieran como ponerle un progressbar1 a este codigo


function CopiaTodo(Origen,Destino : String) :
LongInt;
var
F : TShFileOpStruct;
sOrigen, sDestino : String;
begin
Result := 0;
sOrigen := Origen + #0;
sDestino := Destino + #0;
with F do
begin
wFunc := FO_COPY;
pFrom := @sOrigen[1];
pTo := @sDestino[1];
fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION
end;
Result := ShFileOperation(F);
end;
begin
CopiaTodo('F:\archivos c\*.*','c:\archivos c\');
end;
end.

PeterPunk
17-01-2008, 13:26:00
No es exactamente lo que quieres, pero si añades ZeroMemory(@F,SizeOf(F)); al código, se muestra la ventanita de copiar indicando que archivos está copiando y cuánto tiempo falta. También podrías utilizar FOF_NOCONFIRMMKDIR si el directorio destino no existe
function CopiaTodo(Origen,Destino : String) : LongInt;
var
F : TShFileOpStruct;
sOrigen, sDestino : String;
begin
Result := 0;
sOrigen := Origen + #0;
sDestino := Destino + #0;
ZeroMemory(@F,SizeOf(F));
with F do
begin
wFunc := FO_COPY;
pFrom := @sOrigen[1];
pTo := @sDestino[1];
fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR
end;
Result := ShFileOperation(F);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
CopiaTodo('d:\Borland_delphi_7\*.*','d:\BD7\');
end;

[COLOR=black]De todas formas si quieres que se muestre en tu propio progressbar me parece que tendrás que ir enviando archivo por archivo a copiar para controlar lo que vas copiando. Algo así (me ayudo de una filelistbox para enviar los archivos):

procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
begin
filelistbox1.Directory:= 'd:\Borland_delphi_7';
filelistbox1.Update;
progressbar1.max:= filelistbox1.Count;
progressbar1.Step:= 1;
for i:= 0 to filelistbox1.Count - 1 do
begin
CopiaTodo('d:\Borland_Delphi_7\' + filelistbox1.Items.Strings[i],
'd:\BD7\' + filelistbox1.Items.Strings[i]);
progressbar1.StepIt;
end
end;

Bueno, aquí deberías modificar algo el código para copiar los subdirectorios.
Aún así, este código no sería muy exacto ya que si copiamos 99 archivos de 1 Kb y un archivo de 200 Megas, hay un 1 % de la progressbar que tardaría en mostrarse muchísimo más que el resto, pues el progressbar depende del número de archivos y no del tamaño de estos.
La opción perfecta (no la voy a programar) sería saber cuánto ocupa el directorio entero y luego copiar por código delphi (sin la API de Windows) con BlockRead y BlockWrite e incrementar el buffer en la progressbar.
Saludos.

kurono
18-01-2008, 01:40:30
ok lo revisare a ver que hago

cHackAll
18-01-2008, 02:07:22
Tambien echale un ojo a éste (http://www.clubdelphi.com/trucos/index.php?id=423&scroll=0&scrollb=0) truco.

Saludos