Asunto: Forma sencilla copia seguridad de carpeta - Delphi
He realizado una aplicación con Delphi, utiliza tablas Paradox, las cuales guardo en una carpeta llamada "Tablas" donde está el ejecutable de la aplicación. Quiero añadirle la opción de "Copia de seguridad" para que copie la carpeta "Tablas" a otra ubicación especificada, no necesito compresión ni nada por el estilo, un simple copiar y pegar ¿cómo puedo hacerlo?
Como mucho me gustaría que en la carpeta de destino se creara una subcarpeta con la fecha del día (aaaa-mm-dd) en el nombre, para no reemplazar copias anteriores.
Publicado:
Mar Abr 01, 2008 11:07 pm
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Forma sencilla copia seguridad de carpeta - Delphi
Anuncios
varios escribió:
He realizado una aplicación con Delphi, utiliza tablas Paradox, las cuales guardo en una carpeta llamada "Tablas" donde está el ejecutable de la aplicación. Quiero añadirle la opción de "Copia de seguridad" para que copie la carpeta "Tablas" a otra ubicación especificada, no necesito compresión ni nada por el estilo, un simple copiar y pegar ¿cómo puedo hacerlo?
Como mucho me gustaría que en la carpeta de destino se creara una subcarpeta con la fecha del día (aaaa-mm-dd) en el nombre, para no reemplazar copias anteriores.
Por un lado, en el formulario de configuración de tu aplicación, colocas un TEdit (para indicar el destino de la copia de seguridad), y un par de TCheckBox (para indicar si se desea crear la subcarpeta con el día, mes y año y para indicar si se desean reemplazar los ficheros en caso de que existan en el destino).
Si no dispones de formulario de configuración, puedes añadir estos parámetros en el formulario de copia de seguridad o puedes prescindir de ellos y establecerlos de forma fija.
El procedimiento de copia de seguridad sería algo así:
Código:
procedure TFormMenu.Button1Click(Sender: TObject);
var
carpetaDestino, carpetaOrigen : string;
SearchRec : TSearchRec;
numFicheros, numFicherosError : integer;
reemplazarFicheros : boolean;
begin
carpetaDestino := IncludeTrailingPathDelimiter (
leCadINI ('Copia de seguridad', 'Destino', ''));
if carpetaDestino = '' then
MessageDlg('Debe indicar la carpeta de destino de la copia ' +
'de seguridad. Para ello acceda a "Configuración" y ' +
'especifíquela en la pestaña "Copia de seguridad".',
mtInformation, [mbok], 0)
else
begin
if leBoolINI('Copia de seguridad',
'Crear subcarpeta día', true) then
carpetaDestino := IncludeTrailingPathDelimiter (
carpetaDestino + anoMesDia (Now));
if MessageDlg ('Se va a realizar la copia de los datos de la ' +
'aplicación en: ' + chr(13) + chr(13) +
carpetaDestino + chr(13) + chr(13) +
' · Pulse "Aceptar" para continuar.' + chr(13) +
' · Pulse "Cancelar" para anular el proceso (desde ' +
'"Configuración" podrá cambiar el destino ' +
'de la copia de seguridad.',
mtConfirmation, [mbok, mbcancel], 0) = mrok then
begin
ForceDirectories(carpetaDestino);
carpetaOrigen := IncludeTrailingPathDelimiter (
extractfilepath(Application.ExeName) + 'tablas');
numFicheros := 0;
numFicherosError := 0;
reemplazarFicheros := not leBoolINI('Copia de seguridad',
'Reemplazar', false);
if FindFirst(carpetaOrigen + '*',
faAnyFile, SearchRec) = 0 then
begin
repeat
if (SearchRec.Name <> '.') and
(SearchRec.Name <> '..') and
(SearchRec.Attr <> fadirectory) then
begin
if CopyFile(pchar(carpetaOrigen + SearchRec.Name),
pchar(carpetaDestino + SearchRec.Name),
reemplazarFicheros) then
Inc (numFicheros)
else
inc (numFicherosError);
end;
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
MessageDlg('La copia de seguridad ha finalizado correctamente.' +
chr(13) + chr(13) + 'Número ficheros correctos: ' +
inttostr(numFicheros) + chr(13) +
'Número ficheros incorrectos: ' +
inttostr(numFicherosError), mtInformation, [mbok], 0);
end;
end;
end;
Las funciones utilizadas:
Código:
//Lee una cadena de texto de un INI
function leCadINI (clave, cadena : string; defecto : string) : string;
begin
with tinifile.create (changefileext(paramstr(0),'.INI')) do
try
result := readString (clave, cadena, defecto);
finally
free;
end;
end;
//Lee un booleano de un INI
function leBoolINI (clave, cadena : string; defecto : boolean) : boolean;
begin
with tinifile.create (changefileext(paramstr(0),'.INI')) do
try
result := readbool (clave, cadena, defecto);
finally
free;
end;
end;
function anoMesDia (fecha : TDateTime) : string;
var
ano, mes, dia, hora, minuto, segundo, milisegundo : Word;
txMes, txDia : string;
begin
DecodeDateTime(fecha, ano, mes, dia, hora, minuto, segundo, milisegundo);
txMes := inttostr(mes);
if Length (txMes) = 1 then
txMes := '0' + txMes;
txDia := inttostr(dia);
if Length (txDia) = 1 then
txDia := '0' + txDia;
Para los valores de configuración (destino, reemplazar, crear subcarpeta con fecha) se asume que se han guardado de la siguiente forma:
Código:
esCadINI('Copia de seguridad', 'Destino', txtDestino.Text);
esBoolINI('Copia de seguridad', 'Crear subcarpeta día',
opCrearSubcarpetaDia.Checked);
esBoolINI('Copia de seguridad', 'Reemplazar',
opReemplazar.Checked);
Utilizando las funciones:
Código:
//escribe una cadena de texto en un INI
procedure esCadINI (clave, cadena, valor : string);
begin
with tinifile.create (changefileext(paramstr(0),'.INI')) do
try
writeString (clave, cadena, valor);
finally
free;
end;
end;
//escribe un Booleano en un INI
procedure esBoolINI (clave, cadena : string; valor : boolean);
begin
with tinifile.create (changefileext(paramstr(0),'.INI')) do
try
writeBool (clave, cadena, valor);
finally
free;
end;
end;
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A