2010-05-26 20 views
6

He intentado leer la documentación de las funciones de API del Servicio de instantáneas de volumen, con el fin de copiar los archivos que están actualmente bloqueados (en uso) en Windows XP.¿Muestra del servicio de instantáneas de volumen (VSS) en C?

Desafortunadamente no parece llegar a ninguna parte. ¿Alguien tiene una muestra de código de cómo interactuar con la API para copiar esos archivos?

Gracias, Doori Bar

Respuesta

4

he tenido problemas similares, después de un montón de golpear y ensayos que he conseguido llegar a alguna parte ... aquí es un fragmento de código que puede ayudar:

#include <stdio.h> 

#include <windows.h> 
#include <winbase.h> 

#include <Vss.h> 
#include <VsWriter.h> 
#include <VsBackup.h> 


int main() 
{ 
    int retCode = 0; 
    int i=0; 
    HRESULT hr; 
    IVssEnumObject *pIEnumSnapshots; 
    IVssBackupComponents *ab; 
    VSS_OBJECT_PROP Prop; 
    VSS_SNAPSHOT_PROP& Snap = Prop.Obj.Snap; 
    WCHAR existingFilePath[MAX_PATH] = TEXT("\\temp\\PrinterList.txt"); 
    WCHAR newFileLocation[MAX_PATH] = TEXT("c:\\Users\\PrinterList.txt"); 
    TCHAR existingFileLocation[MAX_PATH]; 

    if (CoInitialize(NULL) != S_OK) 
    { 
     printf("CoInitialize failed!\n"); 
     return 1; 
    } 

    hr = CreateVssBackupComponents(&ab); 
    if(hr != S_OK) 
    { 
     printf("Failed at CreateVssBackupComponents Stage"); 
     return 1; 
    } 

    hr = ab->InitializeForBackup(); 
    if(hr != S_OK) 
    { 
     printf("Failed at InitializeForBackup Stage"); 
     return 1; 
    } 

    hr = ab->SetContext(VSS_CTX_ALL); 
    if(hr != S_OK) 
    { 
     printf("Failed at SetContext Stage"); 
     return 1; 
    } 

    hr = ab->Query(GUID_NULL,VSS_OBJECT_NONE, VSS_OBJECT_SNAPSHOT, &pIEnumSnapshots); 
    if(hr != S_OK){ 
     printf("Failed at Query Stage"); 
     return 1; 
    } 

    // Enumerate all shadow copies. 
    printf("Recursing through snapshots...\n"); 
    while(true) 
    { 
     // Get the next element 
     ULONG ulFetched; 
     hr = pIEnumSnapshots->Next(1, &Prop, &ulFetched); 

     // We reached the end of list 
     if (ulFetched == 0) 
      break; 

     wprintf(L"Snapshot:%s\n", Snap.m_pwszSnapshotDeviceObject); 
     /* 
     At this point you have the Snap object with all the information required for copying the file. 
     example: 
     Snap.m_pwszSnapshotDeviceObject is the root for snapshot object 
     (like \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1) 
     Snap.m_pwszOriginalVolumeName is the full unicode name 
     (like \\?\Volume{1240872a-88de-11df-a94d-806e6f6e6963}\) 
     for the original root(c: mostly) 

     So, you can use CopyFile() to do what you want 
     */ 


     wcscpy(existingFileLocation, Snap.m_pwszSnapshotDeviceObject); 
     wcscat(existingFileLocation, existingFilePath); 
     CopyFile(existingFileLocation, newFileLocation, false); 
     //false here will enable over-write 
    } 
    return retCode; 
} 

Nota: Si su máquina de destino no es lo mismo que la máquina de compilación, deberá incluir definiciones adecuadas y configuraciones de compilación.

Nota: Deberá utilizar los wchars molestos en todas partes, porque estas funciones los utilizan.

+0

Perdón por la respuesta tardía, quería agradecerles por su muestra. Espero que ayude a los demás, porque no se ve como C? –

+0

En realidad, es C, algunas definiciones de estilo C++ son engañosas. Lo editaré y lo convertiré en C estándar, mañana (tenga un plazo para asistir hoy). – lalli

+0

Aquí tienes, es sobre todo C ahora (con win32 por supuesto, necesario para la API) ... – lalli

Cuestiones relacionadas