PDA

Ver la Versión Completa : Copiar directorios completos


macu1975
02-06-2004, 16:56:57
Hola.

Necesito copiar directorios completos y quiero saber si puedo evitar leerme cada uno de los archivos del directorio y copiarlos uno por uno.

Gracias

acertij022
02-06-2004, 17:03:23
procedure TForm1.Button1Click(Sender: TObject);
//Incluye ShellApi

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
Wnd := Application.Handle;
wFunc := FO_COPY;
pFrom := @sOrigen[1];
pTo := @sDestino[1];
fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION
end;

Result := ShFileOperation(F);
end;

begin
CopiaTodo('c:\Delphi6\*.*','c:\kk');
end;

Espero que te sirva

;)

macu1975
02-06-2004, 17:54:46
Muchas gracias, me sirvió....

perrogrun
30-07-2004, 18:06:46
Si alguien necesita más información sobre ShFileOpStructaquí está la documentación de M$ (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/structures/shfileopstruct.asp)

Novás
09-08-2004, 20:39:44
Hola...

Veréis, he probado la función y me ocurre lo siguiente:

Copio los archivos de un cdrom a una ubicación en mi disco duro donde ya existe una versión antigua de los mismos... cuando intento usar esta función empieza sobreescribiéndolos hasta que me encuentro con que algunos de ellos está en uso y no me deja continuar...

He entrado en el link de perrogrun para ver la ayuda de microsoft pero no consigo encontrar algo que me resuelva el problema...

Alguien sabe como hacer para poder sobreescribir estos archivos sin tener que cerrar la aplicación que los está usando...

Muchas gracias

DarkByte
10-08-2004, 02:09:05
Pues... si un archivo está en uso teorícamente no se puede... pero hay de virgerías en xp/2000 que ni te cuento, con decir que he cambiado el nombre a un proceso en ejecución...

Creo que lo mejor sería que probases con un try....except y avisases de que el archivo está en uso y no se pudo copiar... O si no, buscar el ejecutable asociado al programa, ver si está Ejecutandose (no uses el truco de trucomanía pues siempre te va a devolver True...a mi al menos me pasa eso) y si se está ejecutandose avisa y lo asesinas (entiendase cerrar).

Es una sugerencia... ahora puedes hacerlo como quieras ;)

Thoronluin
13-09-2011, 15:23:41
Hola:

Una pregunta. Si uso el código arriba expuesto en una aplicación de consola ¿Cómo puedo obtener el controlador/manejador? diretamente:
Application.Handle
no me serviría ¿Sería así?
GetStdHandle(STD_INPUT_HANDLE)
Saludos y gracias.

escafandra
13-09-2011, 23:00:09
with F do
begin
Wnd:= 0;
.....................

Saludos.

Thoronluin
14-09-2011, 11:58:53
Muchas gracias escafandra.

Saludos.

koalasoft
28-12-2011, 00:32:29
procedure TForm1.Button1Click(Sender: TObject);
//Incluye ShellApi

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
Wnd := Application.Handle;
wFunc := FO_COPY;
pFrom := @sOrigen[1];
pTo := @sDestino[1];
fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION
end;

Result := ShFileOperation(F);
end;

begin
CopiaTodo('c:\Delphi6\*.*','c:\kk');
end;

Espero que te sirva

;)


Cómo se le podría implementar la barra de progreso como este ejemplo: http://www.clubdelphi.com/trucos/index.php?id=423&scroll=0&scrollb=0

Ahora en tu ejemplo que tienes aqui?

Saludos !! :D