一つのファイルあるいはディレクトリは、一つのファイルエントリを持っています。
ファイルエントリにはそのファイルの更新日時やファイル本体の位置 (ファイルが分割されていれば、
全ての分割ファイルの位置) が記述されます。
このため、ファイルが上書き保存されても、ディレクトリ本体=ディレクトリ内の全ファイルの情報
を変更することなく、そのファイルエントリを上書きするだけで済みます。
File Entry format
BP | 大きさ | 型 | 名称 | 内容 |
0〜15 | 16 | struct tag | Descriptor Tag | TagID=261 |
16〜35 | 20 | struct icbtag | ICB Tag | ICB |
36〜39 | 4 | unsigned long | Uid | =-1 ファイル所有者ID |
40〜43 | 4 | unsigned long | Gid | =-1 ファイル所有グループID |
44〜47 | 4 | unsigned long | Permissions | 許可条件 |
48〜49 | 2 | unsigned short | File Link Count | 自分+サブディレクトリ数 |
50 | 1 | unsigned char | Record Format | =0 記録形式 |
51 | 1 | unsigned char | Record Display Attributes | =0 記録表示属性 |
52〜55 | 4 | unsigned long | Record Length | =0 記録長 |
56〜63 | 8 | unsigned int64 | Information Length | ファイルサイズ [bytes] |
64〜71 | 8 | unsigned int64 | Logical Blocks Recorded | 使用している論理ブロックの数 |
72〜83 | 12 | struct timestamp | Access Date and Time | 最新アクセス日 |
84〜95 | 12 | struct timestamp | Modification Date and Time | 更新日時 |
96〜107 | 12 | struct timestamp | Attribute Date and Time | 属性修正日時 |
108〜111 | 4 | unsigned long | Checkpoint | =1 チェックポイント |
112〜127 | 16 | struct long_ad | Extended Attribute ICB | 拡張属性ICBの位置 |
128〜159 | 32 | struct regid | Implementation Identifier | *開発者名 |
160〜167 | 8 | unsigned int64 | Unique Id | 一意ID |
168〜171 | 4 | unsigned long | Length of Extended Attributes (=L_EA) | Extended Attributes の長さ [bytes] |
172〜175 | 4 | unsigned long | Length of Allocation Descriptors (=L_AD) | Allocation descriptors の長さ [bytes] |
176〜176+L_EA-1 | L_EA | unsigned char[L_EA] | Extended Attributes | 拡張属性 |
176+L_EA〜176+L_EA+L_AD-1 | L_AD | unsigned char[L_AD] | Allocation descriptors | (分割)ファイル本体の場所 もしくはファイル本体 |
Uid と Gid は、
UDF1.02 では特別な理由が無ければ無効を示す 2
32-1 (=0xFFFFFFFF, -1) を記入します。
Permissions は、ユーザーが実行できるファイルの動作を示します。
これは、実際の使用者 (ユーザーIDで区別される) で異なります。
ユーザーID と Uid が同じファイル所有者 Owner (ビット10〜14)
ユーザーID と Gid が同じグループ所属者 Group (ビット5〜9)
どちらでもない一般ユーザー Other (ビット0〜4)
の 3 種です。
それぞれに、Execute (実行)、Write(書き込み)、Read(読み取り)、Change Attribute(属性変更)、Delete(削除)、
の 5 種の動作が各ビットに割り振られ、そのビットが 1 ならその動作実行可能、0 なら実行不可です。
Allowed access
bit | 使用者 | 意味 |
0 | Other | Execute |
1 | Other | Write |
2 | Other | Read |
3 | Other | Change Attribute |
4 | Other | Delete |
5 | Group | Execute |
6 | Group | Write |
7 | Group | Read |
8 | Group | Change Attribute |
9 | Group | Delete |
10 | Owner | Execute |
11 | Owner | Write |
12 | Owner | Read |
13 | Owner | Change Attribute |
14 | Owner | Delete |
15〜31 | 予約 | 予約 |
DVD-ROM なら、ファイルは各 Read が 1 (0x00001084)、ディレクトリは 各 Execute と各 Read が 1 (0x000014A5) です。
File Link Count は、ファイルは 1 、ディレクトリは自身+子ディレクトリ数 です。
UDF1.02 では、Record Format、Record Display Attributes、Record Length は 0 (指定せず) です。
(Record Length は Record Format に依存します。)
Information Length はファイルサイズです。ファイルが分割されていればその総和、
ディレクトリでもその長さです。単位はバイトです。
(本当は、確保しただけで使用していない領域を含みます。)
Logical Blocks Recorded は、ファイルが使っている論理ブロックの数です。
ファイルが一続きならば、
(ファイルサイズ[bytes] + 1論理ブロックサイズ[bytes] -1) / 1論理ブロックサイズ[bytes]
となります。
Checkpoint は最初 1 で、ユーザの指示があれば 1 づつ増やします。
拡張属性ICBを使用しない場合、Extended Attribute ICB を 0 に設定します。
UniqueID は、全てのファイルとディレクトリに割り振られた番号です。
ルートディレクトリは 0、1〜15 は Macintosh 用に予約で、
他のファイルとディレクトリは、16 以上のそれぞれ別の番号をもちます。
普通は、記録順に番号を振ってゆきます。
次に記録するときは、LVID に記録された値を記入し、LVID に保存された値を増やします。
Extended Attributes は、次回以降にお話します。
Allocation descriptors は ICB Tag の Flags の 0〜2 ビットで意味が変わります。
0〜2 では、ファイル/ディレクトリの位置と大きさを記した配置記述子の配列になっています。
0 では short_ad、1 では long_ad、2 では ext_ad、を使用します。
DVD-ROM では short_ad を使用します。
配置記述子は、ファイルが分割されていなければ 1 つだけ、分割されていれば 2 つ以上続きます。
数は L_AD から計算します。
それぞれの配置記述子に、(分割された) ファイルの位置と大きさが入っています。
ファイルの分割の順序は並び順と同じです。
配置記述子の Extent Length の下 29 ビットは、実際の (分割された) ファイルのバイト数
です (論理ブロックの整数倍ではありません)。上 2 ビットは 0 です。
ICB Tag の Flags の 0〜2 ビットが 3 のとき、Allocation descriptors にはファイル/ディレクトリの本体が、
直接記述されています。その長さは L_AD バイトです。この場合、ファイルは分割できません。
UDF1.02 では、一つの分割されたファイルの大きさは最大 2
30 - 論理ブロックサイズ バイトです。
ISO9660 と共存させるときのように、実際にはファイルがつながっている場合でも、
見かけは分割しているように記述します。
UDF1.02 では、ファイルエントリの大きさを 1 論理ブロックに収まるようにします。