Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Ayuda con código para copiar (https://www.clubdelphi.com/foros/showthread.php?t=64227)

radenf 23-03-2009 17:17:25

Ayuda con código para copiar
 
Estimado amigos:

Me he dado cien vueltas tratando de crear un form para respaldar una base de datos. El método copyfile no funciona, posiblemente por la extensión del archivo (.abs). Encontré un código que utiliza la ShellApi que si copia el archivo,sin embargo lo copia en la carpeta del ejecutable y no en la ruta señalada, creando un archivo que no posee la extensión requerida. Al cambiar el nombre y extensión de dicho archivo manualmente, corresponde perfecto al que quiero copiar.
Como este código utiliza la ShellApi y no obtuve respuesta en otra sección, encontré conveniente crear un nuevo hilo en la sección correspondiente :

Código Delphi [-]
var
Fos : TSHFileOpStruct;
Buf : array[0..4096] of char;
p : pchar;
sDest : string;

procedure TBackup.Button1Click(Sender: TObject);
begin
ABSRegistros.Connected :=False;
FillChar(Buf, sizeof(Buf), #0) ;
p := @buf;
p := StrECopy(p,'C:\Windows\Regsdata\Registros.abs');
sDest := 'e:\';
FillChar(Fos, sizeof(Fos), #0) ;
with Fos do
begin
Wnd := Handle;
wFunc := FO_COPY;
pFrom := @Buf;
pTo := @sDest;
fFlags := 0;
end;
if ((SHFileOperation(Fos) <> 0) or (Fos.fAnyOperationsAborted <> false)) then
Message1.MessageDlg('Error al copiar el archivo',mtWarning, [mbOK], 0);
end;

Con la primera línea desconecto la base de datos.
Luego al ejecutar el código me genera los siguientes errores:
- A pesar que el destino es la Unidad E, copia el archivo Registros.abs en la carpeta del ejecutable.
- Crea un archivo sin extensión cuyo nombre son tres caracteres cualquiera y no el nombre y extensión del archivo.

¿Puede alguien por favor ayudarme a corregir el código ?
¿ Es posible con un edit definir la carpeta de destino ?

Saludos y muchas gracias

DarkMan 23-03-2009 21:08:01

Código Delphi [-]
var
  Fos : TSHFileOpStruct;
  Buf : array[0..4096] of char;
  p : pchar;
  sDest : string;

procedure TBackup.Button1Click(Sender: TObject);
begin
  ABSRegistros.Connected :=False;
  FillChar(Buf, sizeof(Buf), #0) ;
  p := @buf;
  p := StrECopy(p,'C:\Windows\Regsdata\Registros.abs');
  sDest := 'e:\Registros.abs';
  FillChar(Fos, sizeof(Fos), #0) ;
  with Fos do
  begin
    Wnd := Handle;
    wFunc := FO_COPY;
    pFrom := @Buf;
    pTo := pChar(sDest);
    fFlags := 0;
  end;
  if ((SHFileOperation(Fos) <> 0) or (Fos.fAnyOperationsAborted <> false)) then
    Message1.MessageDlg('Error al copiar el archivo',mtWarning, [mbOK], 0);
end;

Cita:

Empezado por radenf
¿ Es posible con un edit definir la carpeta de destino ?

Si, es posible, solo tienes que asignar a la variable 'sDest' el valor del 'Edit.text'.


Por cierto, el método copyFile si funciona, seguramente el fallo sea el mismo que el que estabas cometiendo en este código, que era no especificar el nombre final del archivo en la carpeta destino.

Un saludo.

radenf 23-03-2009 21:40:33

Muchas gracias por tu aporte DarkMan, apenas llegue a casa lo pruebo. Respecto al método Copyfile probé con múltiples rutas y nunca logré que copiara nada. Tengo que señalarte que yo soy absolutamente inexperto y lo que hasta ahora he logrado ha sido probando y equivocándome, desafortunadamente hay muchas cosas de código que no se encuentran en los libros o manuales.

Saludos y nuevamente muchas gracias

radenf 24-03-2009 12:12:30

Eternamente agradecido DarkMan,funcionó a la perfección y evitándome crear todas las excepciones tales como, directorio inexistente, sobreescribir archivo, etc.

Un gran saludo


La franja horaria es GMT +2. Ahora son las 08:20:41.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi