当 table 不包含大小时,如何从路径 table 读取 iso9660 上的目录?

How can I read a directory on iso9660 from the path table when the table does not include size?

根据 iso9660 / ecma119 的结构规范,路径 table 包含每个路径的记录,包括起始扇区的位置及其名称,但不包括其大小。我可以找到目录条目,但不知道它包含多少个扇区(通常为 2048 字节)。是一个吗?二?六个?

如果我"walk the directory tree",每个目录条目包括引用的位置和大小,所以我可以知道有多少字节(本质上是多少扇区,因为一个目录必须使用整个扇区)来阅读。但是,路径 table 包括起始位置,而不是大小,让我不知道要读取多少字节。

在我的示例 iso (ubuntu-18.04.1-live-server-amd64.iso fwiw) 中,主卷描述符中的根目录条目显示:

         Root Directory:
      Directory Record Length: 34
    Extended Attribute Length: 0
           Location of Extent: 20  [=12=]000014  00:00:20
                  Data Length: 2048  [=12=]000800
      Recording Date and Time: 23:39:04 07/25/2018  GMT 0
                   File Flags:    visible regular dir non-record no-perms single-extent
               File Unit Size: 0
          Interleave Gap Size: 0
       Volume Sequence Number: 1
              File Identifier: .   (current directory)

既然它说 Data Length2048,我知道只读一个扇区。

然而,路径table中的根目录条目显示:

       Path Record Length: 10  [=13=]A
Extended Attribute Length: 0  [=13=]
       Location of Extent: 20  [=13=]000014  00:00:20
  Parent Directory Number: 1  [=13=]01
          File Identifier: .   (current directory)

它也指向扇区 20,但没有告诉我它使用了多少扇区,让我猜测。

是的,一个扇区中未使用的字节应该都是0x00,所以如果我读入一个扇区,读取记录,然后得出一个第一个字节(长度)为0x00,然后我知道我已经到达记录的末尾,但这有三个问题:

  1. 如果那是规范的方式,为什么还要在目录条目中包含大小?
  2. 如果它包含 2 个或 3 个扇区,我一次阅读它们比一次阅读一个更有效率。
  3. 如果我有一个目录,其记录正好填满一个扇区,但没有一些大小属性,我不知道下一个扇区是否应该作为条目读取,或者目录是否在此处结束。

基本上,我知道如何读取有序路径 table 以获取目录条目,但不知道如何使用它来了解目录本身要读取多少扇区。理论上,我可以读取父级以获取此目录的条目以了解大小,但这增加了查找和读取并且几乎违背了路径 table.

的目的

啊,我想通了。因为目录条目 总是 以目录本身的目录条目开始,数据长度总是字节 10-17(小端为 10-13,大端为 13-17 endian),您可以从扇区的开头读取字节 10-17 并获取大小。仍然不如将它放在路径 table 本身中那么有效 - 不知道他们为什么不这样做 - 但它有效。