para intentar añadir una opción interesante: copia incremental utilizando bit de modificado.
Para la copia incremental, en vez de usar la fecha de modificación que a veces no va bien (por diferencia de hora del equipo que guarda el fichero copiado con el equipo que lo tiene y demás historias de Windows, he leído por ahí que Windows incorpora un atributo en los ficheros para este tipo de copias incrementales.
Pero no tengo ni idea de cómo implentar esto en Delphi ¿existe tal opción para los ficheros de Windows? ¿cómo podría implementarlo en AjpdSoft Copia de Seguridad? ¿cómo consultar el estado de ese atributo?
Publicado:
Dom Oct 04, 2009 8:29 pm
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Mejorar AjpdSoft Copia de Seguridad, bit de modificado
Anuncios
varios escribió:
He descargado el código fuente de la aplicación AjpdSoft Copia de Seguridad:
para intentar añadir una opción interesante: copia incremental utilizando bit de modificado.
Para la copia incremental, en vez de usar la fecha de modificación que a veces no va bien (por diferencia de hora del equipo que guarda el fichero copiado con el equipo que lo tiene y demás historias de Windows, he leído por ahí que Windows incorpora un atributo en los ficheros para este tipo de copias incrementales.
Pero no tengo ni idea de cómo implentar esto en Delphi ¿existe tal opción para los ficheros de Windows? ¿cómo podría implementarlo en AjpdSoft Copia de Seguridad? ¿cómo consultar el estado de ese atributo?
Efectivamente se trata de un atributo que Windows incorpora a los ficheros, válido para particiones NTFS (no es válido para FAT32). Dicho atributo, llamado "FILE_ATTRIBUTE_ARCHIVE", está siendo probado por nuestros desarrolladores como opción para agregarlo a la aplicación AjpdSoft Copia de Seguridad.
En Windows XP o Windows 2003, si pulsas con el botón derecho del ratón sobre un fichero, seleccionas "Propiedades", en la pestaña "General" verás un botón "Opciones avanzadas...", si pulsas en él te aparecerá una ventana como la siguiente:
En "Atributos de índice y archivo histórico" verás un check que dice "Archivo listo para archivar históricamente", si pulsas en la ayuda te mostrará algo así:
Especifica si el archivo o carpeta se debe almacenar. Algunos programas utilizan esta opción para determinar de qué archivos y carpetas se harán copias de seguridad. Si selecciona varios archivos o carpetas, una marca de verificación indicará que todos los archivos o carpetas tienen activado el atributo de almacenamiento. Una casilla de verificación rellena indica que algunos archivos o carpetas tienen establecido el atributo de almacenamiento y otros no.
Como ves sí existe tal atributo y es perfectamente implementable en Delphi, se trata como un atributo más de un fichero (como el de oculto, no indexar, sistema, sólo lectura, etc.).
El comportamiento de este atributo es el siguiente: si lo desmarcas de la ventana que te hemos comentado, permanecerá desmarcado hasta que se realice un cambio en el fichero, en cuyo caso el sistema operativo lo marcará.
De esta forma, Windows marcará los archivos que se modifiquen y tú, desde tu aplicación, comprobarás si ese atributo está activo, si lo está copiarás el fichero (pues ha sido modificado desde la última copia de seguridad) y deberás cambiar el atributo y desactivarlo (desmarcarlo) para que en la próxima copia de seguridad no se copie, a no ser que se haya modificado.
Sin duda se trata de un método bastante más eficiente que comprobar la fecha de modificación de dos ficheros (el origen y el destino). La única "pega" es que no te servirá en sistemas de ficheros FAT32 y necesitarás permisos sobre los ficheros (para poder cambiarle el atributo de "Archivo listo para archivar históricamente" tras copiarlo.
Ultima edición por alonsojpd el Dom Oct 04, 2009 9:18 pm, editado 1 vez
Publicado:
Dom Oct 04, 2009 8:38 pm
varios Magnífico usuario
Registrado: Oct 10, 2006 Mensajes: 2092
Asunto: Re: Mejorar AjpdSoft Copia de Seguridad, bit de modificado
Anuncios
alonsojpd escribió:
Efectivamente se trata de un atributo que Windows incorpora a los ficheros, válido para particiones NTFS (no es válido para FAT32). Dicho atributo, llamado "FILE_ATTRIBUTE_ARCHIVE", está siendo probado por nuestros desarrolladores como opción para agregarlo a la aplicación AjpdSoft Copia de Seguridad.
En Windows XP o Windows 2003, si pulsas con el botón derecho del ratón sobre un fichero, seleccionas "Propiedades", en la pestaña "General" verás un botón "Opciones avanzadas...", si pulsas en él te aparecerá una ventana como la siguiente:
En "Atributos de índice y archivo histórico" verás un check que dice "Archivo listo para archivar históricamente", si pulsas en la ayuda te mostrará algo así:
Especifica si el archivo o carpeta se debe almacenar. Algunos programas utilizan esta opción para determinar de qué archivos y carpetas se harán copias de seguridad. Si selecciona varios archivos o carpetas, una marca de verificación indicará que todos los archivos o carpetas tienen activado el atributo de almacenamiento. Una casilla de verificación rellena indica que algunos archivos o carpetas tienen establecido el atributo de almacenamiento y otros no.
Como ves sí existe tal atributo y es perfectamente implementable en Delphi, se trata como un atributo más de un fichero (como el de oculto, no indexar, sistema, sólo lectura, etc.).
El comportamiento de este atributo es el siguiente: si lo desmarcas de la ventana que te hemos comentado, permanecerá desmarcado hasta que se realice un cambio en el fichero, en cuyo caso el sistema operativo lo marcará.
De esta forma, Windows marcará los archivos que se modifiquen y tú, desde tu aplicación, comprobarás si ese atributo está activo, si lo está copiarás el fichero (pues ha sido modificado desde la última copia de seguridad) y deberás cambiar el atributo y desactivarlo (desmarcarlo) para que en la próxima copia de seguridad no se copie, a no ser que se haya modificado.
Sin duda se trata de un método bastante más eficiente que comprobar la fecha de modificación de dos ficheros (el origen y el destino). La única "pega" es que no te servirá en sistemas de ficheros FAT32 y necesitarás permisos sobre los ficheros (para poder cambiarle el atributo de "Archivo listo para archivar históricamente" tras copiarlo.
Ok, lo entiendo, es interesante, pero ¿cómo modifico ese atributo en los ficheros desde Delphi? ¿cómo obteno su valor actual?
Publicado:
Dom Oct 04, 2009 8:39 pm
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Mejorar AjpdSoft Copia de Seguridad, bit de modificado
Anuncios
varios escribió:
Ok, lo entiendo, es interesante, pero ¿cómo modifico ese atributo en los ficheros desde Delphi? ¿cómo obteno su valor actual?
Para modificar el valor del atributo "Archivo listo para archicar históricamente" desde una aplicación Delphi puedes utilizar la siguiente función para Delphi, que te permitirá activar o desactivar este atributo de "bit de modificado":
Código:
function cambiarAtributoArchivo (fichero : string;
activar : boolean) : boolean;
var
resultado : boolean;
atributos: Cardinal;
begin
resultado := false;
atributos := GetFileAttributes(PChar(fichero));
if activar then
begin
if (atributos and FILE_ATTRIBUTE_ARCHIVE) > 0 then
resultado := false
else
resultado := SetFileAttributes (PChar(fichero),
atributos + FILE_ATTRIBUTE_ARCHIVE);
end
else
begin
if (atributos and FILE_ATTRIBUTE_ARCHIVE) > 0 then
resultado := SetFileAttributes (PChar(fichero),
atributos - FILE_ATTRIBUTE_ARCHIVE)
else
resultado := false;
end;
result := resultado;
end;
Y un ejemplo de lo que tendrías que ejecutar tras copiar el fichero (para desactivar este atributo):
Código:
procedure TForm1.Button1Click(Sender: TObject);
begin
if FileExists('C:\ajpdsoft.txt') then
begin
if cambiarAtributoArchivo('C:\ajpdsoft.txt', false) then
MessageDlg('El atributo de Oculto ha sido cambiado correctamente.',
mtInformation, [mbok], 0)
else
MessageDlg('El atributo de Oculto no ha podido ser cambiado.',
mtWarning, [mbok], 0);
end;
end;
De esta forma será el sistema operativo el que cambie el valor de dicho atributo activándolo si el fichero se modifica.
Para obtener el valor actual de este atributo con Delphi puedes utilizar esta función:
Código:
function obtenerAtributoArchivo (fichero : string) : boolean;
var
atributos: Cardinal;
begin
atributos := GetFileAttributes(PChar(fichero));
Result := (atributos and FILE_ATTRIBUTE_ARCHIVE) > 0;
end;
Un ejemplo de uso:
Código:
procedure TForm1.Button2Click(Sender: TObject);
begin
if obtenerAtributoArchivo('C:\ajpdsoft.txt') then
ShowMessage('El atributo "Archivo listo para archivar ' +
'históricamente" está activo. El fichero se ha ' +
'modificado desde la última copia de seguridad.')
else
ShowMessage('El atributo "Archivo listo para archivar ' +
'históricamente" no está activo. El fichero no se ' +
'ha modificado desde la última copia de seguridad.');
end;
Publicado:
Dom Oct 04, 2009 9:00 pm
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Mejorar AjpdSoft Copia de Seguridad, bit de modificado
Anuncios
En el siguiente enlace tienes una función que te permitirá cambiar cualquier atributo con Delphi en un fichero (Sólo lectura, Oculto, Listo para archivar, No indexar, Sistema, Fuera de línea, Temporal, Normal)::
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