使用部分檔案

有時候,只備份和還原檔案區段會很有用。 VSS 提供 部分檔案 機制,如果要求者支援,則允許寫入器指定部分檔案備份和還原。

部分檔案作業通常最常用於維護非常大型檔案的寫入器,只有一小部分的備份作業在備份作業之間變更。 這是這種情況,通常只會複製變更為備份媒體的該區段。 基於這個理由,部分檔案作業通常不是獨佔,而是用來支援增量備份和還原作業。

如果寫入器想要實作部分檔案作業,它會使用 CVssWriter::IsPartialFileSupportEnabled 來判斷其正在使用的要求者是否支援作業。

如果要求者支援部分檔案作業,而且它會將管理檔案的元件 (或定義包含檔案) 的元件集的元件新增至備份元件檔,寫入器會指出處理 PrepareForBackup 或 PostSnapshot) 事件時,通常會在處理 PrepareForBackupPostSnapshot 事件時儲存哪些 (區段,方法是呼叫 IVssComponent::AddPartialFile

除了路徑和檔案名之外,寫入器還會提供範圍、選擇性中繼資料資訊給 IVssComponent::AddPartialFile

範圍資訊會以包含下列任一項的字串的形式提供:

  • 要備份 (位元組) 檔案中的位移配對,以及要 (備份的區段長度,以位元組) 、以冒號分隔的位移和長度,以及以逗號分隔的每個配對,例如 Offset1**:Length1,** Offset2**:**Length2

    每個值都是以十六進位或十進位格式 (64 位整數,) 分別指定位元組位移和以位元組為單位的長度。

  • 二進位範圍檔案目前系統上包含下列專案的完整路徑,包括檔案名:

    • 以 64 位整數表示的數位 (,) 包含在檔案中的不同檔案範圍
    • 以 64 位整陣列表示的每個範圍:要備份之檔案中位移的第一個成員,以位元組為單位) (,而第二個成員是要備份之資料長度 (位元組)

如果寫入器使用範圍檔案來指定部分檔案作業,則要求者必須保證此檔案已備份 (,即使檔案不一定是預設備份組的一部分,) 或以其他方式在備份媒體上保留範圍資訊。 如果未備份範圍檔案的資訊,則無法還原部份備份的檔案。

寫入器也可以新增包含中繼資料的字串。 此中繼資料可以是寫入器特定的格式,因為它的目的是允許寫入器驗證任何未來的還原。

使用這項資訊,支援的要求者可以執行部分檔案備份。

例如,請考慮大型檔案,其標頭 (位元組 64-512) 包含記錄計數和其他經常更新的資訊,以及最新的資料可在檔案的最後 65536 個位元組中找到,也就是0x1239E8577A 0x1239E7577A。

寫入器可以將範圍清單指定為字串 「64:448,0x1239E8577A:65536」。

在還原時,以及在實際執行還原作業之前,要求者應該檢查是否有任何檔案需要部分檔案支援。

若要這樣做,要求者會先使用 IVssBackupComponents::GetWriterComponentsCountIVssBackupComponents::GetWriterComponents::GetWriterComponents在備份元件檔中逐一查看寫入器。

接著會使用IVssBackupComponents::GetWriterComponents介面傳回IVssWriterComponentsExt介面的實例,該介面會提供IVssWriterComponentsExt::GetComponentsExt::GetComponentsExt::GetComponentCount,讓要求者取得IVssComponent實例。

這可讓要求者取得部份備份檔案的相關資訊,以使用IVssComponent::GetPartialFileCountIVssComponent::GetPartialFile,針對對應至管理檔案 (的元件,或是定義包含檔案之元件集的元件) 。

如果部分檔案作業是由範圍檔案所控制,則應在將資料複製到磁片之前先還原該檔案。 要求者可能需要將範圍檔案複製到磁片上的新位置。 在此情況下,它會指出它已透過 IVssBackupComponents::SetRangesFilePath完成。

接著,要求者會繼續將資料複製到磁片上已位於還原目的地的適當位置。

寫入器 (處理 PostRestore 事件時) ,方法是檢查 IVssComponent::GetFileRestoreStatus 是否有 IVssComponent::GetPartialFile所指示的檔案,判斷部分檔案作業是否成功。 寫入器應該一律嘗試使用位移資訊和備份元件檔中包含的任何中繼資料來驗證此還原的正確性。

如果要求者必須將範圍檔案還原到新位置,VSS 會更新這項資訊,讓 IVssComponent::GetPartialFile 傳回的路徑正確無誤。