No es exactamente lo que quieres, pero si añades
ZeroMemory(@F,SizeOf(F));[color=black] 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
Código Delphi
[-]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;
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):
Código Delphi
[-]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.