读取数据CD
CDRoller将数据CD视为以以下格式之一写入的CD(CD-R)介质:CD-ROM(黄皮书)、CD-ROM XA、Mixed-Mode或CD-Extra。要正确读取CD内容,应首先考虑ISO 9660要求。ISO 9660是一个全球标准,指定数据CD上文件和目录的逻辑格式。
ISO 9660数据结构分为三大类:卷描述符、目录结构和路径表。这些结构相互关联,如图1所示。卷描述符告诉我们目录结构和路径表的位置,目录告诉我们实际文件的位置,路径表为我们提供到每个目录的快捷方式。
主要卷描述符。
目前,ISO 9660中定义了四种类型的卷描述符。通常只使用其中一个,即主卷描述符。其他类型包括启动记录、辅助卷描述符和卷分区描述符。引导记录可用于在用户可以访问卷之前必须执行某种类型初始化的系统,尽管ISO 9660没有指定引导记录中必须包含哪些信息或如何使用。补充卷描述符(SVD)可用于标识备用字符集,以供不支持ISO 646字符集的系统使用。这个乔利特该规范特别利用SVD来指定记录在Unicode字符集中的一组文件。卷分区描述符可用于在逻辑上将卷划分为较小的卷分区,尽管ISO 9660没有指定如何执行此操作,但只指定可以执行此操作。
主卷描述符(PVD)是识别CD-ROM的起点,它从逻辑扇区16开始记录(对应于CD中的两秒钟和十六个扇区,00:02:16)。
CDRoller使用的PVD字段如表1所示。
表1。
字节位置 |
字段名称 |
内容 |
1 |
卷描述符类型 |
1 |
2至6 |
标准标识符 |
CD001号 |
41至72 |
卷标识符 |
允许d个字符(1) |
81至88 |
卷空间大小 |
卷中的逻辑块数 |
129至132 |
逻辑块大小 |
逻辑块的字节大小。大多数ISO9660张光盘使用的逻辑块大小为2048,与扇区相同大小 |
133至140 |
路径表大小 |
路径表的字节长度 |
141至144 |
类型的位置L路径表 |
分配的第一个块的逻辑块号L型路径表,L型表示多字节数值值首先以最低有效字节记录。这个值也以最低有效字节优先记录。 |
149至152 |
类型的位置M路径表 |
分配的第一个块的逻辑块号M型路径表,M型表示多字节数值值首先以最高有效字节记录。这个值也会记录在最重要的字节之前。 |
157至190 |
目录记录用于根目录 |
这是的实际目录记录目录结构的顶部。请参阅目录部分此数据格式的记录。 |
319至446 |
发布者标识符 |
提供所含实际数据的标识符在文件中。允许使用a字符。 |
447至574 |
数据准备标识符 |
执行实际创建的标识符当前卷的。允许使用a字符。 |
575至702 |
应用标识符 |
确定数据的规格记录在文件中。例如,此字段可能包含如果文件是根据标准记录的,则为SGML通用标记语言。 |
703至739 |
版权文件标识符 |
标识根目录中的文件包含本卷的版权声明。如果没有版权文件,此字段应包含所有空格。 |
740至776 |
抽象文件标识符 |
标识根目录中的文件包含此卷的摘要语句。如果有不是抽象文件,此字段应包含所有空格。 |
777至813 |
书目文件标识符 |
标识根目录中的文件包含书目记录。如果没有参考书目文件,此字段应包含所有空格。 |
笔记。
(1) d字符为:A-Z,0-9,_(见ISO-9660:1988,附录A,表15)
(2) a字符包括:a-Z、0-9、_、空格、!、!,“,%,&,',(,),*,+,,-,.,/,:,;,<,=,>,?(见ISO-9660:1988,附录A,表14)
目录结构.
ISO 9660目录结构以分层方式组织。层次结构的顶部是根目录,其位置在主卷描述符中标识。分层绘制时,目录结构类似于树的根,根目录位于结构的顶部,如图2所示
如图2所示,此层次结构中有不同的级别。根目录是级别1上的唯一目录。在图2所示的示例中,子目录Sub1、Sub2和Sub3位于级别2,子目录Sub4以及文件file1和file2位于级别3。为了确保兼容性,ISO 9660对目录结构的深度限制为八级。
ISO 9660卷中的每个文件和目录都有一个与之关联的标识名。此名称称为文件标识符。文件标识符还必须满足以下条件:
- 如果文件名没有字符,则文件扩展名必须至少有一个字符。
- 如果文件扩展名没有字符,则文件名必须至少有一个字符。
- 文件名和文件扩展名的长度之和不能超过30。
ISO 9660还规定了 限制每个文件的路径长度。路径的长度是所有相关目录的长度、文件标识符的长度和相关目录的数量的总和。路径的长度不能超过255。
ISO 9660卷中的目录被记录为包含一组目录记录的文件。每个目录记录描述一个文件或另一个目录。每个目录都有一个父目录。根目录的父目录是根目录本身。每个目录还包含其父目录的记录。给定的目录可能包含多个文件以及多个目录的条目,所有这些目录都具有相同的父目录。
目录记录的内容如表2所示。
表2。
字节位置 |
字段名称 |
内容 |
1 |
目录长度记录 |
字节 |
2 |
扩展属性记录长度 |
字节-此字段指扩展属性记录,提供有关文件的附加信息对于知道如何使用它的系统(例如:此字段用于ISO9660的Apple扩展)。 |
3到10 |
范围的位置 |
这是第一个分配给文件的逻辑块 |
11至18 |
数据长度 |
文件节的长度(字节) |
19至25 |
记录日期和时间 |
由七个字节表示: 1:自1900年以来的年份 2:从1到12的月份 3:每月1日至31日 4:从0到23的一天中的一小时 5:从0到59的每小时分钟 6:从0到59的一分钟的第二秒 7:偏离格林尼治标准时间(GMT)15分钟间隔从-48(西)到+52(东)。 注意,检测卷创建日期和时间CD滚轴时使用PVD根目录记录中的此字段。 |
26 |
文件标志 |
一个字节,其中每一位都是一个标志: 0-如果此位为1,则文件隐藏 1-如果此位为1,则条目为目录。 CDRoller不考虑位2..7。 |
27 |
文件单位大小 |
此字段仅在记录文件时有效以交错模式。否则,此字段为0。注意,如果字段不是0,则CDRoller将忽略该记录。 |
28 |
交错间隙大小 |
此字段仅在记录文件时有效以交错模式。否则,此字段为0。注意,如果字段不是0,则CDRoller将忽略该记录。 |
29至32 |
卷序列号 |
卷中卷的序号目录记录描述的文件所在的集合记录。 |
33 |
文件标识符的长度(LEN_FI) |
字节 |
34至(33+LEN_FI) |
文件标识符 |
解释取决于文件标志中的目录位(位1)。如果设置为零,则该字段表示文件标识符(文件名)。如果已设置设置为ONE,则该字段表示目录标识符(目录名称)。 |
34+长度_FI |
填充字段 |
仅当文件标识符的长度为是一个偶数。如果存在,值为0 |
LEN_DR-LEN_SU+1 |
系统使用(LEN_SU) |
保留供系统使用(例如:在Apple中扩展至ISO 9660)。注意,不考虑此字段由CDRoller |
路径表.
路径表向CDRoller指示光盘上每个目录的快捷方式,而不是让程序读取每个目录以获得所需的文件。这主要是为了提高性能。对于根目录以外的每个目录,路径表都包含一条记录,用于标识目录、其父目录及其位置。
路径表记录的内容如表3所示。
表3。
字节位置 |
字段名称 |
内容 |
1 |
目录长度标识符(LEN_DI) |
长度(字节) |
2 |
扩展属性记录长度 |
如果记录了扩展属性记录,这是以字节为单位的长度。否则,这是0。 |
3到6 |
范围的位置 |
第一个逻辑块的逻辑块编号分配给目录 |
7至8 |
父目录编号 |
路径表中的记录编号此目录的父目录 |
9至(8+LEN_DI) |
目录标识符 |
此字段与目录中的相同记录 |
(9+LEN_DI) |
填充字段 |
仅当LEN_DI为奇数时存在(0) |
ISO 9660的Joliet扩展.
CD/DVD卷识别的基本策略是卷识别序列,这是一个卷描述符序列,每个扇区记录一个,从光盘上最后一节的第一首曲目中的扇区16开始。CDRoller读取这些扇区并从序列中选择特定的卷描述符。此卷描述符充当一种锚定,卷的其余部分将在其上构建。
要检测Joliet CDRoller,请找到补充卷描述符(SVD)并检查Escape Sequences字段是否符合以下USC-2转义序列(十六进制字节):(25)(2F)(40)或(25)。检测到Joliet后,所有标识符都被视为摩托罗拉(“Big Endian”)格式,每个字符还包括两个字节(Unicode字符)。
访问Joliet光盘CDRoller时,考虑了Joliet规范的以下规则:
- 文件或目录标识符的长度最多可达128个字节(64个unicode字符)。
- 对于每个记录的文件,以下总和不得超过240:
-文件标识符的长度;
-所有相关目录的目录标识符的长度;
-相关目录的数量。
- 目录标识符可能包含文件扩展名。
- 目录层次结构的记录深度可能超过8级。
- 卷识别序列支持多会话。
简历.
- 为了验证类型CD/DVD文件系统是否为ISO/Joliet,程序读取一系列卷描述符,每个扇区记录一个,从光盘上最后一个会话的第一个磁道的扇区16开始。如果检测到Joliet类型,则将按照Joliet规范的规则读取所有光盘内容。此步骤还测试了多会话功能。
- 根目录的逻辑块地址(LBA)是目录结构的顶层,也是创建CD/DVD映像的起点。
- 程序尝试正确读取路径表(L和M类型),以便快速访问每个目录(文件夹)。
- 如果路径表有效,则其数据将进一步用于对目录(文件夹)内容(如子目录和(或)文件)的任何访问。