根据 iso9660 / ecma119 的结构规范,路径表包含每个路径的记录,包括起始扇区的位置及其名称,但不包括其大小。我可以找到目录条目,但不知道它包含多少个扇区(通常为 2048 字节)。是一个吗?二?六?
如果我“遍历目录树”,每个目录条目都包含引用的 location和 size,所以我可以知道要读取多少字节(本质上是多少扇区,因为目录必须使用整个扇区)。但是,路径表只包括起始位置,而不包括大小,让我不知道要读取多少字节。
在我拥有的示例 iso(ubuntu-18.04.1-live-server-amd64.iso
fwiw)中,主卷描述符中的根目录条目显示:
Root Directory:
Directory Record Length: 34
Extended Attribute Length: 0
Location of Extent: 20 $00000014 00:00:20
Data Length: 2048 $00000800
Recording Date and Time: 23:39:04 07/25/2018 GMT 0
File Flags: $02 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
is 2048
,我知道只读取一个扇区。
但是,路径表中的根目录条目显示:
Path Record Length: 10 $0A
Extended Attribute Length: 0 $00
Location of Extent: 20 $00000014 00:00:20
Parent Directory Number: 1 $0001
File Identifier: . (current directory)
它也指向扇区20
,但没有告诉我它使用了多少扇区,让我猜测。
是的,一个扇区中未使用的字节应该是 all 0x00
,所以如果我在一个扇区中读取,读取记录,然后找到第一个字节(长度)为 的一个0x00
,那么我知道我已经到达记录的末尾,但是有三个问题:
- 如果那是规范的方式,为什么还要在目录条目中包含大小?
- 如果它包括 2 或 3 个扇区,对我来说一次读取它们比一次读取一个更有效。
- 如果我有一个目录,其记录精确地填充了一个扇区,没有一些大小属性,我不知道下一个扇区是否应该作为条目读取,或者该目录是否在这里结束。
基本上,我知道如何读取有序路径表来获取目录条目,但不知道如何使用它来知道要为目录本身读取多少扇区。理论上,我可以读取父目录以获取该目录的条目以了解大小,但这增加了查找和读取,并且几乎违背了路径表的目的。