システムエリア(先頭16論理セクタ)
データエリア
ボリューム記述子群(PVD、SVD、EVD、VDTなど)
パステーブル
ディレクトリ(ディレクトリ内の子ディレクトリ情報とファイル情報の列)
ファイル本体
システムエリアは、ボリューム(トラックのIndex01)の先頭から 0〜15 論理セクタのことで、普通全てゼロです。
残りがデータエリアです。データエリアは論理ブロックで構成され、数えます。
ファイル本体のデータを読み出すには、16 論理セクタ目にあるボリューム記述子群から始めます。ここにルートディレクトリの情報も書いてあります。そこからディレクトリを階層順に辿ってゆくわけです。
ボリューム記述子群→ルートディレクトリ→子ディレクトリ→ファイル本体
この順序です。
もう少し詳しく書くと、
先頭から16セクタ目より始まるボリューム記述子群
→ボリューム記述子群内の PVD または SVD または EVD
→PVD / SVD / EVD 内のルートディレクトリの情報
→ルートディレクトリ
→ルートディレクトリ内の目的の子ディレクトリの情報
→子ディレクトリ
→子ディレクトリ内の目的の孫ディレクトリの情報
…
→ディレクトリ
→ディレクトリ内の目的のファイルの情報
→ファイル本体
もう一つ、パステーブルを経由する方法があります。パステーブルからは全てのディレクトリの情報が入っています。
ボリューム記述子群→パステーブル→ディレクトリ→ファイル
もう少し詳しく書くと、
先頭から16セクタ目より始まるボリューム記述子群
→ボリューム記述子群内の PVD または SVD または EVD
→PVD / SVD / EVD 内のパステーブルの情報
→パステーブル
→パステーブル内の目的のディレクトリの情報
→ディレクトリ
→ディレクトリ内の目的のファイルの情報
→ファイル本体
となり、ディレクトリの階層を順次辿ってゆく必要がありません。
なお、ファイルの一覧を取得したり検索するだけならば、ファイル本体までアクセスする必要はありません。各ディレクトリ内のファイル情報を読み取るだけで十分です。
パステーブル、ディレクトリ、ファイル、は、論理ブロックの最初のバイトから始まります。大抵、パステーブルとファイルでは、それが論理ブロックの大きさより大きい場合、そのまま次の論理ブロックに続きます。ディレクトリでは、一つのディレクトリレコードが論理ブロックを跨がないよう、足りない場合は余った部分に 0x00 を入れ、次の論理ブロックからディレクトリレコードを記述しなおします。いずれも、最後の論理ブロックの終わりのほうが余った場合、0x00 で埋めます。
シンプルな CD-ROM では、
ボリューム記述子群
パステーブル
ディレクトリ群
ファイル群
の順で記録されています。ディレクトリはパステーブルのルールに従って並べられており、ディレクトリ内のディレクトリレコードは識別子(名前)コード順に並べられます。多くの場合、ファイル本体もまたこれらのルールに倣って並べられています。
ですがパステーブルとディレクトリとファイルの位置に厳密なルールが存在するわけではありません。ディレクトリとファイルがごっちゃ(フルパス名でのソートや、OS上のファイルを再帰を使って検索したそのままの順序)になっている場合もあります。ファイルを先に記録し、後ろにパステーブルとディレクトリ群を置く人もいます。PVD と SVD が並存したり、UDF Bridge のように他のシステムと共存させている場合にはより複雑です。