2014-03-04 42 views
1

我在理解一些Microsoft PST file format specification時遇到問題。MS-PST:節點,子節點和塊之間的關係是什麼?

我的理解:

在NDB層,我們的條目是NID。給定一個NID,我們可以在BTree中找到葉節點。從那裏,我們有bidData和bidSub。

bidData指向外部數據節點或數據樹。

bidSub指向一個子節點樹。

我的問題:

  1. 我們能有沒有數據樹的子節點的樹?
  2. 什麼情況下會有子節點樹?
  3. 是否將子節點樹與數據樹的結果連接起來?

回答

3

您有5個問題。

  1. 節點,子節點和塊之間的關係是什麼?
  2. 我們可以有一個沒有數據樹的子節點樹嗎?
  3. 什麼情況下會有子節點樹?
  4. 是否將子節點樹與數據樹的結果連接起來?
  5. 我應該先遍歷數據塊/樹,然後是子節點樹,還是有其他方式來組織我讀取的數據?

每位於here標準第1個問題的答案是

節點是由一個字節流和 收集子節點的抽象。它由NDB層實現爲數據塊 塊(第2.2.2.8.3.1節)和子節點BTree(第2.2.2.8.3.3節)。 節點BTree(第2.2.2.7.7.4節)中的NBTENTRY結構存在 以定義哪些塊結合形成節點。

根據圖here,您會看到根據您的理解,節點具有NID,bidData和bidSub。

摘要是由數據塊或數據BTree組成的節點,它可以指向數據塊和子節點BTree。

一個子節點BTree包含SIBLOCK和SLBLOCK結構,它們包含SIENTRY和SLENTRY結構。

回答問題2,是的,你可以有一個沒有數據BTree的子節點Btree。由於數據樹只是指定bidData的一種形式,另一種是指定數據塊目錄。

更具體地說,爲了創建按照2.6.1.2.2的子節點,您需要有一個數據塊才能將SLENTRY與它關聯。該數據塊可以直接指定,也可以是包含一個或多個外部或內部數據塊引用的數據。

如果你的問題是我們可以有一個子節點Btree例如bidSub,沒有設置相關的bidData,答案是否定的,如上所述。如果您已根據here將bidData初始化爲0x0,以表示尚未具有數據塊的佔位符節點,則在設置有效的bidData之前,SLENTRY將不會與佔位節點關聯。

回答問題3,子節點用於將數據分爲邏輯/分層節。我不知道你的情況,所以除了以下答案之外,我不能真正回答這個問題。

當您需要將數據存儲在PST中時,您將擁有子節點樹,這些數據很好地導向了邏輯分隔。根據here,消息對象中現有的子節點使用示例將附件存儲在消息傳遞層中,並按照here將表上下文存儲在LTP層中,並按照here在屬性上下文中存儲附加存儲。

回答問題4,我不明白朮語結果的含義。據我所知,來自數據樹和子節點樹的信息的組合發生在LTP或消息傳遞層。

回答問題5,它真的取決於你在做什麼? PST SDK提供了一種機制來迭代節點數據庫中的節點,這是一種從節點讀取數據流的機制,而不是直接進行,它還提供了按照herehere迭代第一級子節點的方法。

引用(不是已經鏈接其他)

+0

也許我的假設之一是不正確。我將NDB層看作提供LTP層的接口,LTP層可以請求NodeID,NDB層返回單個Stream,它將遍歷與該NodeID相關的所有數據。 –

+0

考慮到這個假設,問題4問:我應該先遍歷數據塊/樹,然後是子節點樹,還是有一些其他方式來組織數據我讀 –

+0

根據您對問題3的回答,它導致我相信子節點在NDB層不相關,並且NDB層應該可能爲子節點樹暴露第二個流? –