可选择性和使用组件属性
使用隐式选择的组件需要同时访问备份组件文档和编写器元数据文档。
主要有两个原因:
- 存储在备份组件文档中的组件数据 (由 IVssComponent 接口表示) 缺少对组件文件集信息(文件规范、路径和递归标志)的访问权限。 (请参阅 使用备份组件 Document.)
- 只有备份期间在备份组件文档中 显式包含 的组件,其信息直接存储在备份组件文档中。 请求者和编写者必须将通过 IVssComponent 接口提供的信息与 逻辑路径 信息和编写器元数据文档结合使用,以获取有关 隐式包含 组件的信息和设置属性。
组件的逻辑路径中讨论的“MyWriter”案例可用于说明备份的可选择性。
组件名称 | 逻辑路径 | 可选择进行备份 | 可选择还原 | 显式包含 |
---|---|---|---|---|
“可执行文件” | "" | N | N | Y |
“ConfigFiles” | “可执行文件” | N | N | Y |
“LicenseInfo” | "" | Y | N | Y |
“Security” | "" | Y | N | Y |
“UserInfo” | “Security” | N | N | N |
“证书” | “Security” | N | N | N |
“writerData” | "" | Y | Y | Y |
“Set1” | “writerData” | N | Y | N |
“Jan” | “writerData\Set1” | N | N | N |
“Dec” | “writerData\Set1” | N | N | N |
“Set2” | “writerData” | N | Y | N |
“Jan” | “writerData\Set2” | N | N | N |
“Dec” | “writerData\Set2” | N | N | N |
“Query” | “writerData\QueryLogs” | N | N | N |
“使用情况” | “writerData” | Y | Y | N |
“Jan” | “writerData\Usage” | N | N | N |
“Dec” | “writerData\Usage” | N | N | N |
备份集中隐式包含的组件
在检查编写器的编写器元数据文档 (在备份期间查看 IVssBackupComponents::GetWriterMetadata) 时,请求者应存储所有组件的列表、其 逻辑路径及其文件集信息。
需要文件集和排除的文件信息来确定任何显式或隐式) 包含组件 (的文件列表。
对于无法选择备份上级和不定义 组件集的备份组件,仅需要文件集和排除的文件信息来确定备份组件的所有候选项,因为这些组件不定义子组件。
对于为定义组件集的备份组件显式包含的可选项,需要使用定义组件和所有 子组件 的文件集和排除文件信息来选择要备份的文件。
这意味着,只能通过使用 IVssWMComponent 接口实例检查这些组件的编写器元数据来查找组件的“可执行文件”、“ConfigFiles”和“LicenseInfo”的备份集。
但是,如果备份中显式包含 writerData,则必须检查其 IVssWMComponent 接口实例以及“Set1”的实例, “Jan” (逻辑路径“writerData\Set1”) ,“Dec” (逻辑路径“writerData\Set1”) ,“Set2”,“Jan” (逻辑路径“writerData\Set2”) ,“Dec” (逻辑路径“writerData\Set2”) ,“Query”, “Usage”、“Jan” (逻辑路径“writerData\Usage”) ,“Dec” (与逻辑路径“writerData\Usage”) 。
为此,请求者必须首先确定组件“writerData” (逻辑路径“”) 是可选的。 然后,它必须扫描编写器管理的所有其他组件,以确定其逻辑路径中的第一个元素是否为“writerData”。 那些将“writerData”作为其逻辑路径的前导成员的组件被标识为“writerData”的子组件,并在显式选择时隐式选择该组件。
事实上,需要进行类似的扫描,以确定没有组件将“LicenseInfo”作为其逻辑路径的主导成员,因此“LicenseInfo”没有子组件。
由于 VSS 中此机制的复杂性,许多请求者编写者可能会发现创建自己的结构来存储显式和隐式添加的组件的组件和备份集信息很有用。
隐式包含组件的属性
在还原和备份操作期间, IVssComponent 和 IVssBackupComponents 接口的实例用于检索有关组件的信息,以及设置或更改组件属性。 但是,只有显式包含的组件才会具有 IVssComponent 接口的实例,或者 IVssBackupComponents 接口可以访问这些实例。
某些属性在范围中是组件集范围的。 这些属性包括:
- 备份和还原状态:
IVssBackupComponents::SetBackupSucceeded
IVssComponent::GetBackupSucceeded
IVssBackupComponents::SetFileRestoreStatus
IVssComponent::GetFileRestoreStatus
- 备份和还原选项:
IVssBackupComponents::SetBackupOptions
IVssComponent::GetBackupOptions
IVssBackupComponents::SetRestoreOptions
IVssComponent::GetRestoreOptions
- 失败消息:
IVssComponent::SetPostRestoreFailureMsg
IVssComponent::SetPreRestoreFailureMsg
IVssComponent::SetPostRestoreFailureMsg
IVssComponent::SetPreRestoreFailureMsg
- 还原目标:
IVssComponent::SetRestoreTarget
IVssComponent::GetRestoreTarget
- 备份标记:
IVssComponent::SetBackupStamp
IVssComponent::GetBackupStamp
- 其他元数据:
IVssComponent::SetRestoreMetadata
IVssComponent::GetRestoreMetadata
IVssComponent::SetBackupMetadata
IVssComponent::GetBackupMetadata
因此,可以使用组件集的定义成员的 IVssComponent 接口实例,或者将定义成员的名称、类型和逻辑路径与 IVssBackupComponents 方法结合使用来设置或检索组件集的所有成员的属性。
因此,组件集被视为单位。 例如,仅当组件集的所有文件集的备份成功时,组件集的备份才成功。
在前面的示例中,假设组件“Jan” (中的一个文件逻辑路径为“writerData\Set2”) 是“writerData”定义的组件集的成员。 如果其中一个“Jan”文件无法备份,请求者将使用“writerData”的信息 (其名称“writerData”、其路径“”及其组件类型) 作为参数,同时设置 IVssBackupComponents::SetBackupSucceeded withfalse 以指示组件集的失败。
同样, IVssComponent::GetBackupSucceeded 为 IVssComponent 接口的“writerData”实例返回的状态不仅适用于“writerData”,也适用于其所有子组件。
此外,如果编写器选择使用 IVssComponent::SetRestoreTarget 的 IVssComponent 实例的还原目标,则会更改“writerData”的所有子组件的所有文件集的还原目标。
以下属性不适用于组件范围,而是应用于特定文件或文件集:
- 备用位置映射:
IVssBackupComponents::AddAlternativeLocationMapping
IVssComponent::GetAlternateLocationMapping
IVssComponent::GetAlternateLocationMappingCount
- 差异文件:
IVssComponent::AddDifferencedFilesByLastModifyTime
IVssComponent::GetDifferencedFile
IVssComponent::GetDifferencedFilesCount
- 部分文件:
IVssComponent::AddPartialFile
IVssComponent::GetPartialFile
IVssComponent::GetPartialFileCount
- 定向目标:
IVssComponent::AddDirectedTarget
IVssComponent::GetDirectedTarget
IVssComponent::GetDirectedTargetCount
- 新目标:
IVssBackupComponents::AddNewTarget
IVssComponent::GetNewTarget
IVssComponent::GetNewTargetCount
当请求者使用 IVssBackupComponents 接口访问子组件的这些功能时,它将使用组件集的定义组件的组件信息,但使用子组件的文件或文件集信息。
同样,如果可通过 IVssComponent 接口访问属性,则使用与定义子组件对应的实例,但文件或文件集参数取自子组件。
例如,假设逻辑路径为“writerData\Set2”的子组件“Jan” () 具有路径为“c:\fred”的文件集,文件规范为“*.dat”,而递归标志 true 可能必须还原到备用位置。
如果是这样, 请求者调用 IVssBackupComponents::AddAlternativeLocationMapping,使用“writerData”的信息 (组件类型、组件名称“writeData”、逻辑路径“”) 以及“Jan”的文件集信息 (路径“c:\fred”、文件规范“*.dat”和递归等于 true) 。
请注意,在这种情况下,文件集信息必须与 IVssCreateWriterMetadata::AddFilesToFileGroup、 IVssCreateWriterMetadata::AddDatabaseFiles 或 IVssCreateWriterMetadata::AddDatabaseLogFiles 使用的文件集信息完全匹配,以便将文件添加到 1 月。
同样,如果编写器希望将定向目标添加到路径为“c:\ethel”且名称为“lucy.dat”的文件,该文件由“Jan”管理, (逻辑路径为“writerData\Set2”) ,它将使用与“writerData”对应的 IVssComponent 实例,但使用“Jan”的文件信息。
还原集中隐式包含的组件
如果已隐式包含在备份中的组件可以选择还原,则可以将其显式包含在还原中。 如 使用还原和子组件的可选择性中所述,此类组件使用 IVssBackupComponents::AddRestoreSubcomponent 方法添加到备份组件文档中。
但是,这不会创建 IVssComponent 接口的新实例,也不会通过 IVssBackupComponents 接口直接访问组件。
相反,必须通过 IVssComponent 接口的实例来访问显式包含用于还原但隐式包含用于备份的组件,该接口对应于在备份时定义组件集的组件集。
例如,若要显式包括用于还原的“Set1”(备份组件“writerData”可选择的子组件),可以通过调用 IVssComponent 接口的“writerData”实例的 IVssComponent::GetRestoreSubcomponent 方法获取有关它的信息。