C 中的卷影复制服务 (VSS) 示例?

Posted

技术标签:

【中文标题】C 中的卷影复制服务 (VSS) 示例?【英文标题】:Volume Shadow Copy Service (VSS) sample in C? 【发布时间】:2011-02-24 02:12:12 【问题描述】:

我一直在尝试阅读有关卷影复制服务的 API 功能的文档,目的是复制当前在 Windows XP 下被锁定(正在使用)的文件。

不幸的是,我似乎一无所获。任何人碰巧有一个如何与 API 交互以复制此类文件的代码示例?

谢谢,Doori 酒吧

【问题讨论】:

【参考方案1】:

我也遇到过类似的麻烦,经过多次尝试和尝试,我终于找到了某个地方…… 这是一个可能有帮助的代码 sn-p:

#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 \\?\Volume1240872a-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,因为这些函数使用它们。

【讨论】:

抱歉回复晚了,我想感谢您提供的样本 - 我希望它对其他人有所帮助,因为它看起来不像 C? 其实是 C,一些 C++ 风格的定义会产生误导。明天我将对其进行编辑并使其成为标准 C(今天有截止日期)。 你忘记给CoUninitialize()打电话了。

以上是关于C 中的卷影复制服务 (VSS) 示例?的主要内容,如果未能解决你的问题,请参考以下文章

Windows VSS:两个卷影副本之间的区别?

需要在 32/64 位 QT C++ 程序中使用卷影复制服务

Windows-删除Windows Server backup卷影副本

使用 app.config 配置卷影复制

仅在Windows Server上运行的命令diskshadow

解决Windows Server 2003 NTbackup 出错8193问题