2010-05-26 3 views
6

J'essayais de lire la documentation des fonctions API de Volume Shadow Copy Service, dans le but de copier des fichiers qui sont actuellement verrouillés (en cours d'utilisation) sous Windows XP.Exemple de service VSS (Volume Shadow Copy Service) dans C?

Malheureusement, je ne semble pas aller nulle part. Quelqu'un a-t-il un exemple de code pour interagir avec l'API, pour copier de tels fichiers?

Merci, Doori Bar

Répondre

4

J'ai eu des problèmes similaires, après beaucoup de hit-and-essais, j'ai réussi à obtenir quelque part ... est ici un extrait de code qui peut aider:

#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; 
} 

Remarque: Si votre machine cible n'est pas la même que la machine de génération, vous devez inclure des définitions et des configurations de construction appropriées.

Remarque: Vous devrez utiliser partout les wchar ennuyeux, car ces fonctions les utilisent.

+0

Désolé pour la réponse tardive, je voulais vous remercier pour votre échantillon - J'espère que cela va aider les autres, car il ne ressemble pas à C? –

+0

En fait c'est C, certaines définitions de style C++ sont trompeuses. Je vais l'éditer et le rendre standard C, demain (avoir une date limite pour assister à aujourd'hui). – lalli

+0

Ici vous allez, c'est surtout C maintenant (avec win32 bien sûr, nécessaire pour l'API) ... – lalli

Questions connexes