当 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 Length
是 2048
,我知道只读一个扇区。
然而,路径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
,然后我知道我已经到达记录的末尾,但这有三个问题:
- 如果那是规范的方式,为什么还要在目录条目中包含大小?
- 如果它包含 2 个或 3 个扇区,我一次阅读它们比一次阅读一个更有效率。
- 如果我有一个目录,其记录正好填满一个扇区,但没有一些大小属性,我不知道下一个扇区是否应该作为条目读取,或者目录是否在此处结束。
基本上,我知道如何读取有序路径 table 以获取目录条目,但不知道如何使用它来了解目录本身要读取多少扇区。理论上,我可以读取父级以获取此目录的条目以了解大小,但这增加了查找和读取并且几乎违背了路径 table.
的目的
啊,我想通了。因为目录条目 总是 以目录本身的目录条目开始,数据长度总是字节 10-17(小端为 10-13,大端为 13-17 endian),您可以从扇区的开头读取字节 10-17 并获取大小。仍然不如将它放在路径 table 本身中那么有效 - 不知道他们为什么不这样做 - 但它有效。
根据 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 Length
是 2048
,我知道只读一个扇区。
然而,路径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
,然后我知道我已经到达记录的末尾,但这有三个问题:
- 如果那是规范的方式,为什么还要在目录条目中包含大小?
- 如果它包含 2 个或 3 个扇区,我一次阅读它们比一次阅读一个更有效率。
- 如果我有一个目录,其记录正好填满一个扇区,但没有一些大小属性,我不知道下一个扇区是否应该作为条目读取,或者目录是否在此处结束。
基本上,我知道如何读取有序路径 table 以获取目录条目,但不知道如何使用它来了解目录本身要读取多少扇区。理论上,我可以读取父级以获取此目录的条目以了解大小,但这增加了查找和读取并且几乎违背了路径 table.
的目的啊,我想通了。因为目录条目 总是 以目录本身的目录条目开始,数据长度总是字节 10-17(小端为 10-13,大端为 13-17 endian),您可以从扇区的开头读取字节 10-17 并获取大小。仍然不如将它放在路径 table 本身中那么有效 - 不知道他们为什么不这样做 - 但它有效。