Windows VSS (теневое копирование тома) на C++

Мне нужна помощь, чтобы заставить VSS работать на C++. Моя основная цель — сканировать папку на наличие измененных файлов (по дате изменения), а затем создавать их резервные копии на другом устройстве с помощью VSS. Документация неясна (по крайней мере для меня) о том, как я могу это сделать, и я не могу найти достойных примеров того, как это сделать.

Мой процесс должен работать следующим образом:

Папка сканируется и создается список измененных файлов. Создается моментальный снимок VSS, и файлы копируются. Снимок VSS отбрасывается или освобождается (или что-то еще).

Вот что у меня есть (обработка ошибок удалена для краткости):

VSS_SNAPSHOT_PROP snapshotProperties;
::CoInitialize(NULL);
::CreateVssBackupComponents(&m_pBackupComponents);
m_pBackupComponents->InitializeForBackup();
m_pBackupComponents->StartSnapshotSet(&m_SnapshotSetId);
m_pBackupComponents->AddToSnapshotSet(wszVolumePathName, GUID_NULL, &snapshotId);
m_pBackupComponents->SetBackupState(TRUE, FALSE, VSS_BT_FULL, FALSE);
m_pBackupComponents->PrepareForBackup(&pPrepareForBackupResults);
pPrepareForBackupResults->Wait();
m_pBackupComponents->DoSnapshotSet(&pDoSnapshotSetResults);
m_pBackupComponents->GetSnapshotProperties(snapshotId, &snapshotProperties); <-- Never gets beyond here

Хорошо, это кажется правильным методом, однако поток копирования зависает на последней строке кода и больше не идет.

Спасибо, Дж.

РЕДАКТИРОВАТЬ: обновлено, чтобы показать новый метод, который останавливается на GetSnapshotProperties()


person JWood    schedule 13.04.2011    source источник
comment
Вы все еще ищете ответ?   -  person J Evans    schedule 26.06.2011


Ответы (2)


После DoSnapshotset вам нужно вызвать следующую функцию

hr = pDoSnapshotSetResults->Wait(); если (!УСПЕШНО(час)){ unLoadLibrary(); вернуть 1; }

    HRESULT hrDoSnapshotSetResults;

    hr = pDoSnapshotSetResults->QueryStatus(&hrDoSnapshotSetResults, NULL);
    if (!SUCCEEDED(hr)){    unLoadLibrary(); return 1;  }

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

person Rahim    schedule 31.12.2011

Экземпляры VSS_SNAPSHOT_PROP извлекаются с помощью вызова GetSnapshotProperties(). Вам нужно создать новый набор, вызвав StartSnapshotSet(), а затем добавить том в набор снимков с помощью AddToSnapshotSet() перед получением свойств.

person Aaron Saarela    schedule 13.04.2011
comment
Спасибо за предложение. Интересно, что я пытался это сделать, но приложение не могло пройти мимо вызова GetSnapshotProperties(), оно просто сидело там, и поток не продвигался дальше этого вызова. Должно быть, я сделал что-то не так, поэтому я буду исследовать это дальше. - person JWood; 13.04.2011
comment
Я обновил вопрос, чтобы показать поток, который я пытаюсь использовать с помощью StartSnapshotSet(), который останавливается на последней строке. - person JWood; 14.04.2011