使用隱含選取的元件需要同時存取備份元件檔和寫入器元數據檔。
有兩個原因:
- 儲存在備份元件檔中的元件資料(由 IVssComponent 介面表示)無法存取元件檔集資訊—檔案規格、路徑和遞歸旗標。 (請參閱 使用備份元件檔。
- 只有在備份期間,備份元件檔中明確包含的元件,其資訊會直接儲存在備份元件檔中。 要求者和寫入者必須使用可透過 IVssComponent 介面取得的信息,並結合 邏輯路徑 資訊及寫入者元數據文件,以取得並設置 隱含 組件的相關信息和屬性。
元件邏輯路徑中討論的「MyWriter」案例 可用來說明備份的可選取性。
| 元件名稱 | 邏輯路徑 | 可以選擇進行備份 | 可選取以進行還原 | 明確包含 |
|---|---|---|---|---|
| “可執行檔” | "" | N | N | Y |
| “ConfigFiles” | “可執行檔” | N | N | Y |
| “LicenseInfo” | "" | Y | N | Y |
| “安全性” | "" | Y | N | Y |
| “UserInfo” | “安全性” | N | N | N |
| 證書 | “安全性” | N | N | N |
| “writerData” | "" | Y | Y | Y |
| "組合1" | “writerData” | N | Y | N |
| “Jan” | “writerData\Set1” | N | N | N |
| 12月 | “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 |
| “Usage” | “writerData” | Y | Y | N |
| “Jan” | “writerData\Usage” | N | N | N |
| 12月 | “writerData\Usage” | N | N | N |
備份集中隱含包含的元件
在備份期間檢查寫入器的寫入器元數據文件(請參閱 IVssBackupComponents::GetWriterMetadata)時,請求者應儲存所有元件的清單、其 邏輯路徑,以及其檔案集資訊。
需要檔案集和排除的檔案資訊,才能判斷任何包含之元件(明確或隱含)的檔案清單。
對於無法選取備份祖系的備份元件,且無法針對未定義 元件集的備份元件選取,則只有檔案集和排除的檔案資訊,才能識別所有元件的備份候選專案,因為這些元件不會定義子元件。
針對明確被選取為備份之元件集的元件,必須使用檔案集及排除檔案資訊,該資訊需適用於定義元件及所有子元件 ,以選擇要備份的檔案。
這表示,必須先使用 IVssWMComponent 介面的實例檢查這些元件的寫入器元數據,才能找到元件 "Executables"、"ConfigFiles" 和 "LicenseInfo" 的備份集。
不過,如果backup中明確包含 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」的檔案無法備份,要求者在設定 IVssBackupComponents::SetBackupSucceeded 時,將使用“writerData”的資訊(即名稱“writerData”、路徑“” 和其元件類型)作為參數,並將 設為 false 以表示該元件集備份失敗。
同樣地,IVssComponent::GetBackupSucceeded 針對「writerData」的 IVssComponent 介面實例傳回的狀態不僅適用於「writerData」,也適用於其所有子元件。
此外,如果寫入器選擇使用 IVssComponent::SetRestoreTarget “writerData” 實例 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 介面存取,則會使用對應至定義子元件的實例,但會從子元件取得檔案或檔案集自變數。
例如,假設子元件 「Jan」 (含邏輯路徑 」writerData\Set2“) 的檔案集具有 ”c:\fred“ 的路徑、”*.dat“ 的檔案規格,以及 true 的遞歸旗標可能必須還原至替代位置。
如果是這種情況,要求者會使用 「writerData」 的資訊呼叫 IVssBackupComponents::AddAlternativeLocationMapping,並使用 “writerData” 的資訊 (元件類型, “writeData” 的元件名稱和 “” 的邏輯路徑,以及 “Jan” 的檔案集資訊(路徑 “c:\fred”、檔案規格 “*.dat”,遞歸 等於 true)。
請注意,在此情況下,檔案集資訊必須與 IVssCreateWriterMetadata::AddFilesToFileGroup、IVssCreateWriterMetadata::AddDatabaseFiles或 IVssCreateWriterMetadata::AddDatabaseLogFiles 將檔案新增至 Jan 時所使用的檔案集資訊完全相符。
同樣地,如果寫入器想要將導向目標新增至路徑為「c:\ethel」的檔案,並將名稱命名為由「Jan」管理的「lucy.dat」(具有邏輯路徑"writerData\Set2"),它會使用對應至「writerData」但含有「Jan」檔案資訊的 IVssComponent 實例。
還原集中默示包含的元件
備份中隱含包含的元件若可以選擇進行還原,則可以明確地在還原中包含。 如 在「使用還原和子元件的可選取性」中所述,這類元件會使用 IVssBackupComponents::AddRestoreSubcomponent 方法新增至「備份元件文件」。
不過,這不會建立 IVssComponent 介面的新實例,也無法透過 IVssBackupComponents 介面直接存取元件。
相反地,明確包含於還原但隱含於備份的元件,必須透過與其在備份時所屬元件集相對應的 IVssComponent 介面實例來存取。
例如,若要明確地包含還原「Set1」,可以從備份元件「writerData」的可選子元件中選擇,您可以呼叫「writerData」實例的 IVssComponent 介面中的 IVssComponent::GetRestoreSubcomponent 方法,以取得其相關資訊。