Образец службы теневого копирования томов (VSS) в C? - PullRequest
6 голосов
/ 26 мая 2010

Я пытался прочитать документацию по функциям API службы теневого копирования томов с целью копирования файлов, которые в данный момент заблокированы (используются) в Windows XP.

К сожалению, я, кажется, никуда не деться. У кого-нибудь есть пример кода для взаимодействия с API для копирования таких файлов?

Спасибо, Doori Bar

1 Ответ

4 голосов
/ 27 августа 2010

У меня были похожие проблемы, после многих испытаний мне удалось куда-то добраться ... вот фрагмент кода, который может помочь:

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

Примечание. Если ваша целевая машина не совпадает с машиной сборки, вам нужно будет указать правильные определения и конфигурации сборки.

Примечание: вам придется использовать раздражающие wchars везде, потому что эти функции используют их.

...