2014-03-04 45 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层应该可能为子节点树暴露第二个流? –