2010-05-26 20 views
6

Tôi đang cố gắng đọc tài liệu về các chức năng API của Dịch vụ Sao chép Bóng Tối, với mục đích sao chép các tệp hiện đang bị khóa (đang được sử dụng) trong Windows XP.Mẫu Dịch vụ Sao chép Bóng (VSS) trong C?

Thật không may là tôi dường như chẳng đi đến đâu cả. Bất kỳ ai cũng có một mẫu mã về cách tương tác với API, để sao chép các tệp như vậy?

Cảm ơn, Doori Bar

Trả lời

4

Tôi đã có những rắc rối tương tự, sau khi rất nhiều hit-and-thử nghiệm tôi đã quản lý để có được ở đâu đó ... đây là một đoạn mã mà có thể giú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 \\?\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; 
} 

Lưu ý: Nếu máy mục tiêu của bạn không giống với máy xây dựng, bạn sẽ cần bao gồm các định nghĩa và cấu hình xây dựng phù hợp.

Lưu ý: Bạn sẽ phải sử dụng các wchars gây phiền nhiễu ở khắp mọi nơi, bởi vì các chức năng này sử dụng chúng.

+0

Xin lỗi vì câu trả lời trễ, tôi muốn cảm ơn vì mẫu của bạn - tôi hy vọng nó sẽ giúp người khác, bởi vì nó không giống như C? –

+0

Đúng là C, một số định nghĩa kiểu C++ là gây hiểu lầm. Tôi sẽ chỉnh sửa nó và làm cho nó tiêu chuẩn C, ngày mai (có một thời hạn để tham dự ngày hôm nay). – lalli

+0

Ở đây bạn đi, chủ yếu là C bây giờ (với win32 tất nhiên, cần thiết cho API) ... – lalli

Các vấn đề liên quan