使用部分文件

有时,仅备份和还原部分文件很有用。 VSS 提供 部分文件 机制,如果请求者支持,则允许编写器指定部分文件备份和还原。

部分文件操作通常最适用于维护非常大的文件的编写器,其中只有一小部分在备份操作之间发生更改。 在这种情况下,通常只复制已更改为备份介质的节很有用。 因此,部分文件操作通常用于支持增量备份和还原操作,但并非独占。

如果编写器想要实现部分文件操作,它使用 CVssWriter::IsPartialFileSupportEnabled 来确定它正在处理的请求者是否支持该操作。

如果请求者支持部分文件操作,并且它添加管理文件 (的组件或定义包含备份组件文档) 文件的组件集的组件集,则编写器指示在处理 PrepareForBackupPostSnapshot 事件时通常要 (保存文件的哪些部分,) ,方法是调用 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::GetComponentIVssWriterComponentsExt::GetComponentCount,使请求者能够获取 IVssComponent 实例。

这样,请求者可以使用 IVssComponent::GetPartialFileCount 和 IVssComponent::GetPartialFile(对应于管理文件 (的组件或定义包含文件) 的组件集的组件集)的实例,获取有关部分备份文件的信息以参与还原。

如果部分文件操作由范围文件控制,则应在将数据复制回磁盘之前还原该文件。 请求者可能需要将范围文件复制回磁盘上的新位置。 在这种情况下,它指示它已通过 IVssBackupComponents::SetRangesFilePath 执行此操作。

然后,请求者继续将数据复制到磁盘上已有的还原目标中的相应位置。

编写器 (处理 PostRestore 事件时) ,通过检查 IVssComponent::GetPartialFile 指示的文件的 IVssComponent::GetFileRestoreStatus,确定部分文件操作是否成功。 编写器应始终尝试使用偏移量信息和备份组件文档中包含的任何元数据来验证此还原的正确性。

如果请求者必须将 ranges 文件还原到新位置,VSS 将更新此信息,以便 IVssComponent::GetPartialFile 返回的路径正确。