Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   CopyFile String Pchar (https://www.clubdelphi.com/foros/showthread.php?t=34552)

FGarcia 14-08-2006 00:35:36

CopyFile String Pchar
 
Hola!

Antes de que me hechen bronca debo decir que ya busque en varios hilos y no encuentro una respuesta para esto de como usar el CopyFile pues tengo problemas con los tipos string y pchar. Mi codigo:

Código Delphi [-]
function TMDatos.CrearBackUp(DBAccessName: String): boolean;
var
  BackUpDir, BackUpFile, respaldo : string;
begin
  result := false;
  BackUpDir := RutaAPP + '\Respaldos\';
  BackUpFile := 'BkUP_' + DBAccessName;
  Respaldo := (BackUpDir + BackUpFile);
  if not FileExists(DBAccessName) then Exit;
  try
    {Creamos una copia del archivo
    El primer Parametro es el archivo origen, el segundo es el archivo destino
    El tercer parametro si es FALSE sobreescribe el fichero si existe }
    CopyFile(pChar(DBAccessName), PChar(Respaldo), False);
    Result := true;
  except
    Exit;
  end;
end;

la variable RutaApp es:
Código Delphi [-]
 
//Establecemos la ruta de la aplicacion
  RutaAPP := ExtractFilePath(ParamStr(0));

La intencion es crear un respaldo de una BD Access en otra carpeta diferente de donde esta la aplicacion (Respaldos). El problema con este codigo es que cuando verifico el result en otra parte de la aplicacion me dice que el respaldo fue hecho con exito sin embargo no se crea absolutamente nada.
Si creo el respaldo en la misma carpeta de la aplicacion todo funciona OK

Código Delphi [-]
CopyFile(pChar(DBAccessName), PChar(BackUpFile), False);

Gracias!

Lepe 14-08-2006 00:44:36

Cita:

Empezado por Ayuda ExtractFillePath
The resulting string is the leftmost characters of FileName, up to and including the colon or backslash that separates the path information from the name and extension.

Así que:
Código Delphi [-]
 Respaldo := (BackUpDir + BackUpFile);
te queda como "C:\micarpeta\\Respaldos\ .... lo demás ya no importa ;). tienes dos barras invertidas seguidas.

El por qué no te enteras de nada, es precisamente porque en el Except simplemente sales de la rutina y ocultas la excepción que windows debería darte "File or directory not exist" u otro parecido.

Metiéndome donde no me llaman, yo añadiría la fecha y hora en el nombre del Backup, así nunca tendrás 2 nombres de archivos iguales, de camino ya tienes copias incrementales.


Saludos

FGarcia 14-08-2006 01:02:51

Gracias Lepe, sin embargo el problema persiste, no me crea la carpeta respaldos ni el archivo de respaldo (por logica jeje), coloque una rutina despues del except para capturar el error pero sigue igual no marca ningun error.

Código Delphi [-]
try
    {Creamos una copia del archivo
    El primer Parametro es el archivo origen, el segundo es el archivo destino
    El tercer parametro si es FALSE sobreescribe el fichero si existe }
    CopyFile(pChar(DBAccessName), PChar(Respaldo), False);
    Result := true;
  except
    on E:Exception do
        begin
          LogError(E);
          ShowMessage(E.Message);
        end;
  end;

seoane 14-08-2006 01:08:33

Con el permiso de Lepe, voy a discrepar. La doble \ no es el mayor problema que hay aquí, ya que si windows encuentra \\ por el medio de una ruta suele tomarla como una sola, aunque tampoco quiero decir que eso este bien hecho.

El problema es el siguiente, si a la función le pasas como parametro, por ejemplo, "archivo.txt" la función Copyfile nos quedaría así:

Código Delphi [-]
  Copyfile('archivo.txt','c:\ruta\\Respaldos\archivo.txt',FALSE);

Por lo tanto si el archivo que queremos copiar se encuentra en el mismo directorio que nuestra aplicación no habría problemas (aparte de la \\), pero si el archivo no se en cuenta en el mismo directorio la función fallara.

Un ultimo apunte: dentro del bloque try ... except no hay ninguna función que pueda generar una excepción (la función CopyFile no genera excepciones) así que no entiendo para que lo usas.

FGarcia 14-08-2006 01:21:03

Aqui nuevamente, la doble \ ya esta corregido, lo de la excepcion ok se borro, sin embargo esto sigue sin generar la carpeta respaldo y el archivo de respaldo asi que la pregunta sigue en el aire ¿por que? ¿que esta mal?
por cierto Lepe lo de la hora y fecha esta considerado pero vamos por partes

Saludos!

seoane 14-08-2006 01:23:06

:rolleyes: ¿La carpeta respaldo existe? La funcion Copyfile no crea carpetas, si no existe la carpeta la funcion fallara.

FGarcia 14-08-2006 01:30:23

Ciertamente un error de interpretacion de la funcion, ya se creo la carpeta y el correspondiente respaldo. ¡Gracias nuevamente!

Lepe 14-08-2006 18:12:07

Si vas a tener en cuenta lo de la fecha y hora... te aviso: Windows no permite la barra como nombre de un archivo 22/01/2006 así que antes usa :

formatdatetime('dd-mm-yyyy hh nn ss', now);

Saludos


La franja horaria es GMT +2. Ahora son las 07:32:10.

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