Работа с частичными файлами

Иногда полезно создавать резервные копии и восстанавливать только разделы файлов. VSS предоставляет механизмы с частичными файлами , которые, если запросители поддерживают его, позволяют записи указывать частичные резервные копии и восстановление файлов.

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

Если модуль записи хочет реализовать операцию с частичным файлом, он использует CVssWriter::IsPartialFileSupportEnabled , чтобы определить, поддерживает ли операция инициатор запроса, с которым он работает.

Если инициатор запроса поддерживает частичные операции с файлами и добавляет компонент, управляющий файлом (или компонент, определяющий набор компонентов, содержащий файл), в документ компонентов резервного копирования, модуль записи указывает, какие разделы файла нужно сохранить (обычно при обработке события PrepareForBackup или PostSnapshot ), вызывая IVssComponent::AddPartialFile.

Помимо пути и имени файла модуль записи предоставляет диапазон необязательных метаданных В IVssComponent::AddPartialFile.

Сведения о диапазоне предоставляются в виде строки, содержащей одно из следующих значений:

  • Пары смещения в файле для резервного копирования (в байтах) и длина раздела для резервного копирования (в байтах), смещение и длина разделяются двоеточием, а каждая пара разделена запятой, например Offset1**:Length1,** * Offset2**:**Length2.

    Каждое значение представляет собой 64-разрядное целое число (в шестнадцатеричном или десятичном формате), указывающее смещение байтов и длину в байтах соответственно.

  • Полный путь, включая имя файла, в текущей системе файла двоичных диапазонов, содержащего следующее:

    • Число (выраженное в виде 64-разрядного целого числа) различных диапазонов файлов, содержащихся в файле
    • Каждый диапазон, выраженный в виде пары 64-разрядных целых чисел: первый член пары является смещением в файл, для которой выполняется резервное копирование (в байтах), а второй — длиной данных для резервного копирования (в байтах).

Если модуль записи использует файл диапазонов для указания операции с частичным файлом, инициатор запроса должен гарантировать, что будет создана резервная копия этого файла (даже если файл не обязательно является частью резервного набора резервных копий по умолчанию) или что сведения о диапазонах сохраняются на носителе резервного копирования каким-либо другим способом. Если данные файла диапазонов не архивируются, восстановление частично резервного копирования файла будет невозможно.

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

С помощью этих сведений вспомогательный инициатор запроса может выполнить частичное резервное копирование файлов.

В качестве примера рассмотрим большой файл, заголовок которого (байты 64–512) содержит количество записей и другие часто обновляемые сведения, а последние данные которого находятся в последних 65536 байтах файла, 0x1239E8577A 0x1239E7577A.

Модуль записи может указать список диапазонов в виде строки "64:448,0x1239E8577A:65536".

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

Для этого инициатор запроса сначала выполняет итерацию по записи с хранимыми компонентами в документе компонентов резервной копии с помощью IVssBackupComponents::GetWriterComponentsCount и IVssBackupComponents::GetWriterComponents.

Интерфейс IVssBackupComponents::GetWriterComponents затем используется для возврата экземпляров интерфейса IVssWriterComponentsExt , которые предоставляют IVssWriterComponentsExt::GetComponents и IVssWriterComponentsExt::GetComponentCount, которые позволяют инициатору запроса получать экземпляры IVssComponent .

Это позволяет запрашивающей стороне получать сведения о частично резервных копиях файлов для участия в восстановлении с помощью IVssComponent::GetPartialFileCount и IVssComponent::GetPartialFile для экземпляра IVssComponent , соответствующего компоненту, который управляет файлом (или компоненту, определяющему набор компонентов, содержащий файл).

Если операция с частичным файлом контролировалась файлом диапазонов, этот файл необходимо восстановить перед копированием данных обратно на диск. Может случиться, что запрашивающей стороне потребуется скопировать файл диапазонов обратно в новое расположение на диске. В этом случае он указывает, что он сделал это через IVssBackupComponents::SetRangesFilePath.

Затем запрашиватель переходит к копированию данных в соответствующие расположения в назначении восстановления, уже на диске.

Модуль записи (при обработке события PostRestore ) путем проверки IVssComponent::GetFileRestoreStatus на наличие файлов, указанных IVssComponent::GetPartialFile, определяет, была ли операция с частичным файлом успешной. Модуль записи должен всегда пытаться проверить правильность этого восстановления, используя сведения о смещениях и метаданные, включенные в документ по компонентам резервного копирования.

Если инициатору запроса пришлось восстановить файл диапазонов в новом расположении, VSS обновит эти сведения таким образом, чтобы путь, возвращаемый IVssComponent::GetPartialFile , был правильным.