1

我在理解某些Microsoft PST 文件格式规范时遇到问题。

我的理解:

在 NDB 层中,我们的条目是 NID。给定一个 NID,我们可以在 BTree 中找到叶子节点。从那里,我们有bidData 和bidSub。

bidData 要么指向外部数据节点,要么指向数据树。

bidSub 指向一个子节点树。

我的问题:

  1. 我们可以有一个没有数据树的子节点树吗?
  2. 什么情况下我们会有子节点树?
  3. 子节点树的结果是否要与数据树的结果串联?
4

1 回答 1

3

你有 5 个问题。

  1. 节点、子节点、区块之间的关系是什么?
  2. 我们可以有一个没有数据树的子节点树吗?
  3. 什么情况下我们会有子节点树?
  4. 子节点树的结果是否要与数据树的结果串联?
  5. 我应该先遍历数据块/树,然后是子节点树,还是有其他方法来组织我读取的数据?

根据此处的标准,问题 1 的答案是

节点是由字节流和子节点集合组成的抽象。它由 NDB 层实现为数据块(第 2.2.2.8.3.1 节)和子节点 BTree(第 2.2.2.8.3.3 节)。Node BTree(第 2.2.2.7.7.4 节)中的 NBTENTRY 结构用于定义哪些块组合形成节点。

根据这里的图表,您会看到一个节点根据您的理解具有 NID、bidData 和 bidSub。

摘要是由数据块或数据BTree组成的节点,可以指向数据块和子节点BTree。

子节点 BTree 包含 SIBLOCK 和 SLBLOCK 结构,其中包含 SIENTRY 和 SLENTRY 结构。

回答问题 2,是的,您可以拥有一个没有数据 BTree 的子节点 Btree。因为数据树只是指定bidData的一种形式,另一种是指定数据块目录。

更具体地说,为了按照2.6.1.2.2创建子节点,您需要有一个数据块才能将 SLENTRY 与其关联。该数据块可以直接指定,也可以是包含一个或多个外部或内部数据块引用的数据树。

如果您的问题是我们是否可以有一个子节点 Btree,例如bidSub,而没有设置相关的bidData,则答案是否如上。如果您按照此处将bidData 初始化为0x0以表示还没有数据块的占位符节点,则SLENTRY 将不会与占位符节点相关联,直到设置了有效的bidData。

回答问题 3,子节点用于将数据划分为逻辑/分层部分。我不知道你的情况,所以除了下面的答案,我真的无法回答这个问题。

当您需要将数据存储在 PST 中以很好地实现逻辑分离时,您将拥有子节点树。现有使用子节点的示例是在消息对象中按照此处在消息传递层中存储附件,在 LTP 层中存储表上下文按照此处以及在属性上下文中附加存储按照此处

回答问题 4,我不明白你所说的结果是什么意思。据我所知,来自数据树和子节点树的信息组合发生在 LTP 或消息传递层。

回答问题 5,这真的取决于你在做什么?PST SDK 提供了一种迭代节点数据库中节点的机制,一种从节点读取流的机制,而不是直接,它还提供了一种迭代第一级子节点的方法,如herehere

参考文献(已链接的除外)

于 2014-03-22T23:01:28.573 回答