Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Shallow copy

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Shallow copy Responder citando

Alguien sabe como puedo implementar "Shallow Copy"

Necesito en tiempo de ejecución comprimir ciertos archivos, pero estos al estar siendo utilizados no puedo hacerlo.

Según tengo entendido se tendría que crear una copia temporal de dichos archivos y entonces ya podría comprimilos.

Si alguno ha indagado con ello, podría poner algo aquí en el foro, a ver si entre todos podemos implementar dicha función.

Tendría que incorporar librerias dll para todos los sistemas operativos de 32 y 64 bits a mi proyecto (Demasiado engorroso)

La pregunta es...
¿Puedo copiar un fichero que está abierto o en uso y después utilizar la copia para comprimirlo?
El metodo descrito me resultaría más sencillo de implementar.


He encontrado esto:
Link:
https://wj32.org/wp/2012/12/13/how-to-backup-files-in-c-using-the-volume-shadow-copy-service-vss/



Si estás escribiendo un programa de copia de seguridad, tiene que ser capaz de leer y acceder a archivos que están en uso por otros programas. La forma correcta de hacerlo es utilizar el Volume Shadow Copy Service . Las páginas de MSDN abarcan una gran cantidad de material que es innecesario que un simple programa de copia de seguridad, así que aquí están algunos pasos simples para ayudarle a empezar.

Antes de empezar: notas importantes

Este artículo se supone que está utilizando Windows Vista o posterior. Para Windows XP, es posible que tenga que hacer algunas modificaciones a este código.
No se puede utilizar VSS en marcha de un programa de 32 bits en una versión de 64 bits de Windows. En Windows de 64 bits, lo que necesita para compilar una versión de 64 bits de su programa.
Por lo general, el programa necesita para ejecutarse bajo una cuenta de administrador. Si UAC está activada, el programa tiene que ser elevado.
Paso 1. Inicializar componentes de copia de seguridad
Es necesario tener acceso a estas dos funciones: CreateVssBackupComponents , VssFreeSnapshotProperties . Si lo desea, puede enlazar a VssApi.lib. Aquí Me va a utilizar GetProcAddress lugar. Comience con algunas importaciones y definiciones básicas:

Código:

#include <vss>
#include <vswriter>
#include <vsbackup>
 
typedef HRESULT (STDAPICALLTYPE *_CreateVssBackupComponentsInternal)(
    __out IVssBackupComponents **ppBackup
    );
 
typedef void (APIENTRY *_VssFreeSnapshotPropertiesInternal)(
    __in VSS_SNAPSHOT_PROP *pProp
    );
 
static _CreateVssBackupComponentsInternal CreateVssBackupComponentsInternal_I;
static _VssFreeSnapshotPropertiesInternal VssFreeSnapshotPropertiesInternal_I;


Tenga en cuenta que las funciones tienen "interna" al final. Ahora conseguir las funciones y crear el objeto sus IVssBackupComponents:

Código:

HRESULT result;
HMODULE vssapiBase;
IVssBackupComponents *backupComponents;
 
vssapiBase = LoadLibrary(L"vssapi.dll");
 
if (vssapiBase)
{
    CreateVssBackupComponentsInternal_I = (_CreateVssBackupComponentsInternal)GetProcAddress(vssapiBase, "CreateVssBackupComponentsInternal");
    VssFreeSnapshotPropertiesInternal_I = (_VssFreeSnapshotPropertiesInternal)GetProcAddress(vssapiBase, "VssFreeSnapshotPropertiesInternal");
}
 
if (!CreateVssBackupComponentsInternal_I || !VssFreeSnapshotPropertiesInternal_I)
    abort(); // Handle error
 
result = CreateVssBackupComponentsInternal_I(&backupComponents);
 
if (!SUCCEEDED(result))
    abort(); // Handle error


Paso 2. Conectar a VSS

No hay nada interesante.

Código:

VSS_ID snapshotSetId;
 
result = backupComponents->InitializeForBackup();
 
if (!SUCCEEDED(result))
    abort(); // If you don't have admin privileges or your program is running under WOW64, it will fail here
 
result = backupComponents->SetBackupState(FALSE, FALSE, VSS_BT_INCREMENTAL);
 
if (!SUCCEEDED(result))
    abort(); // Handle error
 
result = backupComponents->SetContext(VSS_CTX_FILE_SHARE_BACKUP);
 
if (!SUCCEEDED(result))
    abort(); // Handle error
 
return backupComponents->StartSnapshotSet(&snapshotSetId);


Paso 3. Añadir los volúmenes

Ahora es necesario agregar los volúmenes que le interesan llamando AddToSnapshotSet . Esto le dará una identificación instantánea que necesita ahorrar. Asegúrese de que su nombre de volumen tiene una barra diagonal inversa. En este artículo vamos a suponer que sólo tiene un volumen que le interesa, pero se puede añadir tantos como usted quiere.

Código:

VSS_ID snapshotId;
 
result = backupComponents->AddToSnapshotSet(L"D:\\", GUID_NULL, &snapshotId);
 
if (!SUCCEEDED(result))
    abort(); // Handle error


Paso 4. Realizar la instantánea

Una vez que ha agregado sus volúmenes, es necesario realizar la instantánea utilizando DoSnapshotSet :
Código:

IVssAsync *async;
 
result = backupComponents->DoSnapshotSet(&async);
 
if (!SUCCEEDED(result))
    abort(); // Handle error
 
result = async->Wait();
async->Release();
 
if (!SUCCEEDED(result))
    abort(); // Handle error


Paso 5. Utilice la instantánea (s)

Su instantánea (s) ahora están listos. Para cada uno de los volúmenes, llame GetSnapshotProperties para obtener una VSS_SNAPSHOT_PROP estructura. Utilice el campo m_pwszSnapshotDeviceObject para obtener el nombre del dispositivo (por ejemplo, "\ Device \ HarddiskVolumeShadowCopy1") para la instantánea. Si ha creado una instantánea para D: \ y desea acceder a D: \ Unarchivo.txt, abierta \ Device \ HarddiskVolumeShadowCopy1 \ Unarchivo.txt.
Código:

VSS_SNAPSHOT_PROP prop;
 
result = backupComponents->GetSnapshotProperties(snapshotId, &prop);
 
if (!SUCCEEDED(result))
    abort(); // Handle error
 
// Use prop.m_pwszSnapshotDeviceObject to access your files.
 
VssFreeSnapshotPropertiesInternal_I(&prop);


Paso 6. Limpiar

Sólo se necesita una línea:
Código:

backupComponents->Release();

_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Hola, por si te sirve, y usando el código de la página que publicas:

La prueba lo que hace es copiar un archivo del registro de Windows el cual no se puede copiar mientras se está ejecutando el sistema, el archivo: "C:\Windows\System32\config\SYSTEM".

Probado en Windows 10 Pro x64 y compilado con C++Builder XE4 para 64 bits.

Código:
//--- Añadimos las siguientes cabeceras y librería: -------------------------

#include <vss.h>
#include <vswriter.h>
#include <vsbackup.h>
#include <utilcls.h>
#include <comobj.hpp>
#pragma comment(lib, "VSSAPI.a")

//--- STEP-1 : Initialize backup components ---------------------------------

TComInterface<IVssBackupComponents> backupComponents;
OleCheck(CreateVssBackupComponents(&backupComponents));

//--- STEP-2 : Connect to VSS -----------------------------------------------

VSS_ID snapshotSetId;
OleCheck(backupComponents->InitializeForBackup());
OleCheck(backupComponents->SetBackupState(FALSE, FALSE, VSS_BT_INCREMENTAL));
OleCheck(backupComponents->SetContext(VSS_CTX_FILE_SHARE_BACKUP));
OleCheck(backupComponents->StartSnapshotSet(&snapshotSetId));

//--- STEP-3 : Add the volumes ----------------------------------------------

VSS_ID snapshotId;
VSS_PWSZ vol = const_cast<VSS_PWSZ>(L"C:\\");
OleCheck(backupComponents->AddToSnapshotSet(vol, GUID_NULL, &snapshotId));

//--- STEP-4 : Perform the snapshot -----------------------------------------

TComInterface<IVssAsync> async;
OleCheck(backupComponents->DoSnapshotSet(&async));
OleCheck(async->Wait());
async.Release();

//--- STEP-5 : Use the snapshot(s) ------------------------------------------

VSS_SNAPSHOT_PROP prop;
OleCheck(backupComponents->GetSnapshotProperties(snapshotId, &prop));

    // Usamos prop.m_pwszSnapshotDeviceObject como prefijo
    // para acceder a los archivos originales
    String file = L"\\WINDOWS\\System32\\Config\\SYSTEM";
    file.sprintf(L"%s%s", prop.m_pwszSnapshotDeviceObject, file.c_str());
    CopyFile(file.c_str(), L"C:\\NOW\\SYSTEM", FALSE);

VssFreeSnapshotProperties(&prop);

//--- STEP-6 : Cleaning up --------------------------------------------------
backupComponents.Release();   // Opcional
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: GRACIAS HE PASADO A NBACKUP.EXE Responder citando

Muchas gracias Leo, al final he cambiado a NBackup.exe en linea de comandos.

... y todo de maravilla ya que estaba utilizando FireBird 2.5.2, pero....

al alctualizar a FireBird 3.0 no consigo hacer funcionar el NBackup...

... Te cuento, hasta ahora todo ha ido bien haciendo esto:

Código:

/*nbackup <U> <P> <B> <Primera> <Base> <Backup>*/

/*EJEMPLOS DE COPIA:*/
nbackup -U SYSDBA -P xxxxxx -B 0 "D:\Datos\TPV.IB" "D:\Datos\0.IBK" /*(se parte desde aquí)*/
nbackup -U SYSDBA -P xxxxxx -B 1 "D:\\Datos\TPV.IB" "D:\Datos\1.IBK" /*(Primera copia incremental desde historico CERO)*/
nbackup -U SYSDBA -P xxxxxx -B 2 "D:\\TPV.IB" "D:\Datos\2.IBK" /*(Segunda copia incremental desde historico CERO)*/
nbackup -U SYSDBA -P xxxxxx -B 3 "D:\\TPV.IB" "D:\Datos\3.IBK" /*(Tercera copia incremental desde historico CERO)*/
/*------------------------------------------------------------------------------------------------------------------------------------------------------------------*/



/*EJEMPLOS DE RESTAURACION:*/
nbackup -U SYSDBA -P xxxxxx -R "D:\Datos\TPV_NO_PUEDE_EXISTIR.IB" "D:\Datos\0.IBK"/*(Restauro la incremental INICIAL CERO)*/
nbackup -U SYSDBA -P xxxxxx -R "D:\Datos\TPV_NO_PUEDE_EXISTIR.IB" "D:\Datos\0.IBK" "D:\Datos\1.IBK"/*(Restauro HACIA EL PUNTO DE LA INCREMENTA 1)*/
nbackup -U SYSDBA -P xxxxxx -R "D:\Datos\TPV_NO_PUEDE_EXISTIR.IB" "D:\Datos\0.IBK" "D:\Datos\1.IBK" "D:\Datos\2.IBK"/*(Restauro HACIA EL PUNTO DE LA INCREMENTA 2)*/
nbackup -U SYSDBA -P xxxxxx -R "D:\Datos\TPV_NO_PUEDE_EXISTIR.IB" "D:\Datos\0.IBK" "D:\Datos\1.IBK" "D:\Datos\2.IBK" "D:\Datos\3.IBK"/*(Restauro HACIA EL PUNTO DE LA INCREMENTA 3)*/


Pero con la versión 3.0 de Firebird, llevo mas de 3 días y no consigo que funcione y encima cuando hago la primera copia de seguridad el Fichero de Base de datos principal se queda BLOQUEADO.

He estado leyendo el manual de NBACKUP.EXE y no consigo solucionar el problema.

Quiero actualizar a FireBird 3.0 desde la 2.5.2 pero si no soluciono lo de NBackup, me quedaré con la versión anterior, ya que es muy importante para mi las COPIAS INCREMENTALES. De hecho la pregunta anterior era por este mismo tema, pero al final descubrí que el NBACKUP del FireBird (2.5.2) hacia exentamente lo que yo quería.

desde ya... muchas gracias.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.