2007年06月11日

ISO9660 その12 ディレクトリとディレクトリレコード

ディレクトリは、単純に書くとそのディレクトリが持っている ファイルやディレクトリの情報を記した構造体(ディレクトリレコード)をつなげて並べたものです。
ただ、個々のディレクトリレコードの大きさは、ファイル/ディレクトリの名前の長さによって異なります。

ディレクトリレコードは、次のようになっています。

位置大きさ名称内容
01unsigned charLength of Directory Record (LEN_DR) このディレクトリレコードの長さ [BYTE]
11unsigned charExtended Attribute Record Length 拡張属性レコードの長さ(無ければ0)
2〜54unsigned longLocation of Extent ディレクトリまたはファイル本体の先頭位置 [LBN]
6〜94unsigned long (M)Location of Extent 上に同じ
10〜134unsigned longData Length ディレクトリまたはファイル本体の大きさ [BYTE]
14〜174unsigned long (M)Data Length 上に同じ
18〜247struct datetime_sRecording Date and Time 記録日時
251unsigned charFile Flags ファイルフラグ
261unsigned charFile Unit Size ファイルユニットの大きさ
271unsigned charInterleave Gap Size インタリーブ間隙の大きさ
28〜292unsigned shortVolume Sequence Number ボリューム順序番号
30〜312unsigned short (M)Volume Sequence Number 上に同じ
321unsigned charLength of File Identifier (LEN_FI) ファイル識別子の長さ(LEN_FI)
33〜(33+LEN_FI-1)LEN_FIchar[LEN_FI]File Identifier ファイル/ディレクトリ識別子
33+LEN_FI1unsigned charPadding Field =0 全体を偶数にするため
(LEN_DR-LEN_SU)〜(LEN_DR-1)LEN_SUchar[LEN_SU]System Use システム用

ファイルの場合、Data Length はファイル本体のバイト数です。
ディレクトリの場合、Data Length は
ディレクトリが占有している論理ブロック数×論理ブロック当たりのバイト数
です
また、Data Length に拡張属性の大きさは含みません。


表中の記録日時の構造(datetime_s)は次のとおりです。

位置大きさ名称内容
01unsigned charNumber of years since 1900 西暦年 - 1900
11unsigned charMonth of the year from 1 to 12
21unsigned charDay of the month from 1 to 31
31unsigned charHour of the day from 0 to 23
41unsigned charMinute of the hour from 0 to 59
51unsigned charSecond of the minute from 0 to 59
61charOffset from Greenwich Mean Time in number of 15 min intervals from -48 (West) to +52 (East) グリニッジ標準時からの偏差(15分単位)

こちらの年月日時分秒は文字ではなく数値です。 使われていなければ、全て 0x00 です。
西暦2156年問題があります。

ファイルフラグは次のとおりです。

ビット名称内容
0Existence0=可視ファイル / 1=不可視ファイル
1Directory0=ファイル / 1=ディレクトリ
2Associated File0=主ファイル / 1=関連ファイル
3Record0=ファイルがレコード形式を持たない / 1=レコード形式を持つ
4Protection0=許可条件無効 / 1=許可条件有効
5Reserved予約(=0)
6Reserved予約(=0)
7Multi-Extent0=ファイルの最終ディレクトリレコードである / 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 にある致命的な欠陥の修正というのは、この部分だったりします …ごめんなさい。」)
posted by 七癖 at 09:20| Comment(0) | TrackBack(0) | ファイルシステム | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。