ただ、個々のディレクトリレコードの大きさは、ファイル/ディレクトリの名前の長さによって異なります。
ディレクトリレコードは、次のようになっています。
位置 | 大きさ | 型 | 名称 | 内容 |
0 | 1 | unsigned char | Length of Directory Record (LEN_DR) | このディレクトリレコードの長さ [BYTE] |
1 | 1 | unsigned char | Extended Attribute Record Length | 拡張属性レコードの長さ(無ければ0) |
2〜5 | 4 | unsigned long | Location of Extent | ディレクトリまたはファイル本体の先頭位置 [LBN] |
6〜9 | 4 | unsigned long (M) | Location of Extent | 上に同じ |
10〜13 | 4 | unsigned long | Data Length | ディレクトリまたはファイル本体の大きさ [BYTE] |
14〜17 | 4 | unsigned long (M) | Data Length | 上に同じ |
18〜24 | 7 | struct datetime_s | Recording Date and Time | 記録日時 |
25 | 1 | unsigned char | File Flags | ファイルフラグ |
26 | 1 | unsigned char | File Unit Size | ファイルユニットの大きさ |
27 | 1 | unsigned char | Interleave Gap Size | インタリーブ間隙の大きさ |
28〜29 | 2 | unsigned short | Volume Sequence Number | ボリューム順序番号 |
30〜31 | 2 | unsigned short (M) | Volume Sequence Number | 上に同じ |
32 | 1 | unsigned char | Length of File Identifier (LEN_FI) | ファイル識別子の長さ(LEN_FI) |
33〜(33+LEN_FI-1) | LEN_FI | char[LEN_FI] | File Identifier | ファイル/ディレクトリ識別子 |
33+LEN_FI | 1 | unsigned char | Padding Field | =0 全体を偶数にするため |
(LEN_DR-LEN_SU)〜(LEN_DR-1) | LEN_SU | char[LEN_SU] | System Use | システム用 |
ファイルの場合、Data Length はファイル本体のバイト数です。
ディレクトリの場合、Data Length は
ディレクトリが占有している論理ブロック数×論理ブロック当たりのバイト数
です。
また、Data Length に拡張属性の大きさは含みません。
表中の記録日時の構造(datetime_s)は次のとおりです。
位置 | 大きさ | 型 | 名称 | 内容 |
0 | 1 | unsigned char | Number of years since 1900 | 西暦年 - 1900 |
1 | 1 | unsigned char | Month of the year from 1 to 12 | 月 |
2 | 1 | unsigned char | Day of the month from 1 to 31 | 日 |
3 | 1 | unsigned char | Hour of the day from 0 to 23 | 時 |
4 | 1 | unsigned char | Minute of the hour from 0 to 59 | 分 |
5 | 1 | unsigned char | Second of the minute from 0 to 59 | 秒 |
6 | 1 | char | Offset from Greenwich Mean Time in number of 15 min intervals from -48 (West) to +52 (East) | グリニッジ標準時からの偏差(15分単位) |
こちらの年月日時分秒は文字ではなく数値です。 使われていなければ、全て 0x00 です。
西暦2156年問題があります。
ファイルフラグは次のとおりです。
ビット | 名称 | 内容 |
0 | Existence | 0=可視ファイル / 1=不可視ファイル |
1 | Directory | 0=ファイル / 1=ディレクトリ |
2 | Associated File | 0=主ファイル / 1=関連ファイル |
3 | Record | 0=ファイルがレコード形式を持たない / 1=レコード形式を持つ |
4 | Protection | 0=許可条件無効 / 1=許可条件有効 |
5 | Reserved | 予約(=0) |
6 | Reserved | 予約(=0) |
7 | Multi-Extent | 0=ファイルの最終ディレクトリレコードである / 1=ファイルの最終ディレクトリレコードでない |
隠しファイルのとき、ビット0を設定します。
ビット1でファイルかディレクトリかを判別します。
他は…大抵 0 です。
File Unit Size と Interleave Gap Size は、ファイルが分割されている時に使います。 ファイルが分割されていなければ 0 です。
Volume Sequence Number は、普通一つのボリューム内に全て記入するので、その場合 1 です。
ファイル/ディレクトリ識別子は、いわゆるファイル/ディレクトリ名です。
PVD から辿る場合、ファイル識別子は、次のようになっています。
ファイル名+0x2E+拡張子+0x3B+バージョン
0x2E = '.'
0x3B = ';'
拡張子は無い場合もあります。
バージョンは、1〜32767の数値を文字で記述します。 windows では 1 です。
各文字はd文字を使用します。
よって、
FILENAME.EXT;1
のように書かれています。
(文字数の制限は後まわし。)
EVD から辿る場合、文字はd1文字を使用します。
拡張子、版数などはありません。(当事者間の合意によります。)
ディレクトリでは、最初に自身のディレクトリレコードを、 次に親のディレクトリレコードを記録します。 自分自身のディレクトリ識別子には、1バイトの 0x00 を、 親ディレクトリのディレクトリ識別子には、1バイトの 0x01 を使います。 文字に Unicode のような2バイト文字を使う場合でも、 ファイル識別子の長さ(LEN_FI)を 1 と置き、 単一バイトの 0x00 と 0x01 を使用します。
なお、ルートディレクトリの識別子にも1バイトの 0x00 を使います。 ルートディレクトリ内の親ディレクトリ(0x01)もルートディレクトリ自身を示します。 (無いこともあります。)
それ以外の一般的なディレクトリの識別子にはd/d1文字を使用します。
ファイル識別子の長さが偶数の場合(全体の長さが奇数になってしまった場合) 終端に 1 バイト追加し、0x00 を入れます。これが Padding Field です。 ファイル名の長さが奇数ならば、必要ありません。
System Use は、ファイル名の長さにかかわらず ディレクトリレコードの長さを同じにしたい場合(たまにある)など、 ディレクトリレコード間に隙間を空ける時に使います。
なお、ディレクトリレコードが論理ブロックを跨がないように、 論理ブロックの終わりのほうを 0x00 で埋める必要があります。
(「せんべえの生地作り ver.0.002 にある致命的な欠陥の修正というのは、この部分だったりします …ごめんなさい。」)