Delphi - Problema con Copifile

 
Vista:

Problema con Copifile

Publicado por Romina (40 intervenciones) el 29/07/2005 01:04:02
Hola: Les comento mi problema, estoy trabajando con base de dato interbase y , utilizo copilist para realizar mi copia de seguridad, con esto no tengo problema:

copyfile(pchar('C:\Delphi\ESCUELABD.GDB'),pchar(RUTA),false);

Para restáurala utilizo:

copyfile(pchar('RUTA'),pchar('C:\Delphi\ESCUELABD.GDB'),false)

Pero no funciona.

Aclaro por si acaso que el usuario selecciona la ruta a guardar la copia de seguridad, de los componentes TdriveCombobox,TdirectoryListbox más un agregado de fecha y hora para no repetirse quedando por ejemplo así. C: \Backup\ESCUELABD 06-03-05 15 30 15.GDB.
Aquí la otra duda, tanto para la copia como para la restauración le estoy dando la ruta donde se encuentra mi base de datos, pero cuando el usuario instale el programa no sé que ruta le va dar, por lo tanto no va esto no va servir, como puedo hacer?.

Desde ya gracias
Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema con Copifile

Publicado por Dr Juzam (3 intervenciones) el 29/07/2005 12:59:30
Con respecto a la copia no sé cual es el problema. Deberías decirnos si simplemente no hace nada o el programa arroja algún mensaje o error. Si crees que lo estás haciendo todo bien, puede que la base de datos esté abierta y por lo tanto no se pueda sobreescribir. De todas maneras, debes proporcionarle el nombre completo: Si es 'ESCUELABD 06-03-05 15 30 15.GDB' no puedes decirle solo 'ESCUELABD.GDB'.
Para los directorios, puedes usar lo siguiente:

RutaBackup:=ExtractFilePath (Application.Exename)+'Backup';

Y ya no importa donde lo instale, siempre se harán las copias dentro del directorio del programa, en la carpeta Bakup.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con Copifile

Publicado por Romina (40 intervenciones) el 30/07/2005 17:08:43
Con respecto la copia de seguridad no hace nada, no apaece ningun mensaje.
Quiero aclarar por si estoy haciendo mal que, mi base dato original (podria decirse ) se encuentra y se llama 'C:\Delphi\ESCUELABD.GDB', el usuario hace una copia de esta seleccionando la ruta que desee, el nombre se lo doy yo ,depende de la fecha y hora ESCUELABD 06-03-05 15 30 15.GDB., este es un requisito que me pidieron para que no se repitan.
Ahora, me queda así.
ejemplo
Rura:=C: \Backup\ESCUELABD 06-03-05 15 30 15.GDB(ejem ruta seleccionada por el usuario)
**
(pchar('C:\Delphi\ESCUELABD.GDB'),pchar(RUTA),false);
Para restáurala utilizo:
copyfile(pchar('RUTA'),pchar('C:\Delphi\ESCUELABD.GDB'),false)

No le estaré dando bien la ruta?

Para los directorios Dr juzman me dices
RutaBackup:=ExtractFilePath (Application.Exename)+'Backup';
Siemprese harán las copias dentro del directorio del programa, en la carpeta Bakup. OK a ver si comprendo, en esta carpeta se guardaran las copias que desee el usuario? sería una ruta fija?.Esta sentencia crea esta carpeta Backup en el caso que el usuario nola tenga?.

Talvés no me expese bien la ruta fija que le estoy dando es C:\Delphi\ESCUELABD.GDB donde se encuentra mi base original, pero si el usuario instala el programa en por ejemplo C:\Escuela\...la ruta que le estoy dando en la setencia **no me va servir .

Talvés no estoy entendiendo bien como debo hacer esto. Agradecería ideas.

Lo unico que quiero es realizar la copia de seguridad de mi base de dato que en mi compu se encuentra 'C:\Delphi\ESCUELABD.GDB' (debido a que la instale allí, no se el usuario donde la va guardar) donde el usuario desee para que esta no se repita le agrego datos adicionales de fecha y hora. Luego quiero poder restaurar cualquier de estas copia, supongo que en 'C:\Delphi\ESCUELABD.GDB' se debe sobreescribir.

Disculpen la molestia, y si no comprenden algo agradecería que me lo digan ya necesito ayuda, estoy parada en esto.
saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con Copifile

Publicado por Dr Juzam (821 intervenciones) el 30/07/2005 21:48:52
Yo tuve que hacer un proceso similar al que comentas. Éste es mi código:

procedure TForm1.CrearBackUp;
var
Ruta: WideString;
BD, CopiaBD: TFileStream;
begin
{Seleccionamos el directorio. Siempre será dentro de la carpeta de la aplicación, independientemente de dónde la instale el usuario}
Ruta:=ExtractFilePath (Application.ExeName);
{Si no existe dicha carpeta, la creamos}
if DirectoryExists (Ruta+'BackUp')=false then
if CreateDir (Ruta+'BackUp')=false then begin
{MensajeError es un procedimiento que enseñaba un mensaje por pantalla, del tipo Application.MessageBox pero con algunos cambios. Ahora no viene al caso}
MensajeError ('No se ha podido encontrar y/o crear la carpeta de backup. Asegurese de que el disco '+
'no está protegido contra escritura: No se ha creado backup', 'Error al crear backup');
end;
try begin
{Comenzamos la copia}
BD:= TFileStream.Create(Ruta+'NombreBaseDatos', fmOpenRead or fmShareDenyWrite);
CopiaBD := TFileStream.Create(Ruta+'BackUp\NombreCopiaSeguridad', fmCreate or fmShareDenyRead);
CopiaBD.CopyFrom(BD, BD.Size);
end;
finally
{Liberamos los objetos de memoria}
FreeAndNil(CopiaBD);
FreeAndNil(BD);
end;
end;

Hay otros métodos, pero a mi este me sirvió. Las copias de seguridad se me copiaban en la carpeta Backup dentro del directorio de la aplicación, aunque no existiese previamente. Úsalo a ver si te funciona. Una vez hecho esto, si sigues con dudas podremos ayudarte a reeemplazar el archivo del backup por el original.
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con Copifile

Publicado por Romina (40 intervenciones) el 02/08/2005 20:17:29
Hola:
Probé el código que me has dado, te agradezco enormemente.
La primera parte referida a crear la carpeta Backup no hay problemas, Luego en la parte BD:= TFileStream.Create(Ruta+'NombreBaseDatos', fmOpenRead or fmShareDenyWrite); ‘Cannot open file el proceso no tiene acceso al archivo porque esta siendo usado por otro proceso’ es decir que la base de dato está abierta, lo cual es lógico ya que al ejecutar el programa siempre se abre y pide la contraseña, no sé como debo cerrarla y luego mantenerla abierta para que todo siga funcionando bien.
Debo averiguar esto y como hacer para que me muestre algún error que se comete al cambiar la unidad Ej elegir la unidad de Cd y no esta disponible.
Saludos

Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema con Copifile

Publicado por Dr Juzam (821 intervenciones) el 02/08/2005 20:36:54
Supongo que deberás poner la propiedad Conected del IBDataBase a false ¿no?
Con respecto a lo de los errores, prueba con try..except.
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar