ディレクトリーエントリーとは
ディレクトリーエントリーはファイルやディレクトリー(フォルダー)の属性情報(ファイル名、サイズ、作成日時)を記録する構造体情報です。1エントリーは32バイト固定長で、ファイルの一種としてみなされます。またファイルの先頭クラスター番号も記録しており、ファイルの実データが格納されている領域の開始位置を示します。これを辿ることで、ファイルの全データにアクセスできます。ディレクトリエントリーはファイルシステムがファイルを効率的に管理し、ユーザーがファイルにアクセスできるようにするために不可欠な要素です。
短いファイル名のディレクトリーエントリー
下記表は短いファイル名(SFN)のディレクトリーエントリー構造です。
名前 | オフセット [バイト] | サイズ [バイト] | 内容 |
---|---|---|---|
DIR_Name | 0 | 11 | ベース名と拡張子です。ドットは記録しません。 |
DIR_Attr | 11 | 1 | ファイル属性です。 0x01:ATTR_READ_ONLY 書き込み禁止ファイルであることを表します。 0x02:ATTR_HIDDEN 隠しファイルであることを表します。 0x04:ATTR_SYSTEM システム関連のファイルであることを表します。 0x08:ATTR_VOLUME_ID この属性が設定されたファイルは、ルートディレクトリーに1つだけ存在します。このファイルの名前はボリュームのラベルとなります。またDIR_FstClusHIとDIR_FstClusLOは0である必要があります。 0x10:ATTR_DIRECTORY サブディレクトリーであることを表します。 0x20:ATTR_ARCHIVE バックアップユーティリティーをサポートするために存在します。ファイルが作成、名前変更、または書き込みされた際に、FATファイルシステムドライバーによってこのビットが設定されます。バックアップユーティリティーはこの属性を使用して、最後にバックアップが実行されてからボリューム上のどのファイルが変更されたかを知ることができます。 0x0F:ATTR_LONG_NAME 長いファイル名であることを表します。 |
DIR_NTRes | 12 | 1 | Windows NT用の予約値です。0を設定します。 |
DIR_CrtTimeTenth | 13 | 1 | ファイル作成時の10ミリ秒単位のタイムスタンプです。DIR_CrtTimeは2秒周期の時間しか保存できません。本フィールドではさらに細かい(0~199)×10ミリ秒の時間を表します。 |
DIR_CrtTime | 14 | 2 | ファイルを作成した時間です。(※1) |
DIR_CrtDate | 16 | 2 | ファイルを作成した日付です。(※1) |
DIR_LstAccDate | 18 | 2 | ファイルを最後に開いた日付です。(※1) 書き込みの場合は、DIR_WrtTimeと同じ日付に設定する必要があります。 |
DIR_FstClusHI | 20 | 2 | ファイルの先頭クラスター番号の上位16ビットです。ファイルの実データが格納されている領域の開始位置を表します。FAT12またはFAT16の場合は0です。 |
DIR_WrtTime | 22 | 2 | ファイルの最終書き込み時間です。(※1) ファイルの作成は書き込みとみなされます。 |
DIR_WrtDate | 24 | 2 | ファイルの最終書き込み日付です。(※1) ファイルの作成は書き込みとみなされます。 |
DIR_FstClusLO | 26 | 2 | ファイルの先頭クラスター番号の下位16ビットです。 |
DIR_FileSize | 28 | 4 | ファイルのサイズ [バイト] です。 |
※1:フォーマットは以降の「日時フォーマット」を参照ください。
長いファイル名のディレクトリーエントリー
下記表は長いファイル名(LFN)のディレクトリーエントリー構造です。1つのディレクトリーエントリーに格納できるファイル名は13文字です。したがって最大255文字のファイル名を格納するには「255/13≒19.6」で20個のディレクトリーエントリーが必要になります。また一連のLFNディレクトリーエントリーには、1つのSFNディレクトリーエントリーが付随します。
名前 | オフセット [バイト] | サイズ [バイト] | 内容 |
---|---|---|---|
LDIR_Ord | 0 | 1 | このLFNディレクトリーエントリーが全体のどの部分であるかを示します。[1~20] 1がLFNディレクトリーエントリーの先頭を表します。また0x40(LAST_LONG_ENTRY)フラグが立っていると、それがLFNディレクトリーエントリーの最後であることを表します。 |
LDIR_Name1 | 1 | 10 | 名前の1~5文字目です。UTF-16LEで格納されます。 |
LDIR_Attr | 11 | 1 | SFN表のDIR_Attrと同じです。 |
LDIR_Type | 12 | 1 | 「0」である必要があり、それがLFNのディレクトリーエントリーであることを表します。 |
LDIR_Chksum | 13 | 1 | 本ディレクトリーエントリーのチェックサムです。 |
LDIR_Name2 | 14 | 12 | 名前の6~11文字目です。 |
LDIR_FstClusLO | 26 | 2 | 既存のディスクユーティリティとの互換性のために「0」である必要があります。 |
LDIR_Name3 | 28 | 4 | 名前の12~13文字目です。 |
構成例
下図は長いファイル名「The quick brown.fox」のディレクトリーエントリーが、分割されて保存されている状態を表しています。ファイル名の長さが13の倍数でない場合、ファイル名の終わりはNULL(0000h)で表され、それ以降の空いた枠はFFFFhでパディング(詰め物)します。

チェックサムの計算
チェックサムの計算 はSFNのDIR_Name に対して行われます。上図の例でいうと「THEQUI~1FOX」に対してチェックサムを計算します。
/** ----------------------------------------------------------------------------
* @brief チェックサムの計算
*
* @param [in] pFcbName : SFNの11文字のファイル名
* @return チェックサム
*/
uint8_t ChkSum(uint8_t *pFcbName)
{
uint8_t i;
uint8_t sum = 0;
for (i = 11; i != 0; i--) {
sum = ((sum & 1) ? 0x80 : 0) + (sum >> 1) + *pFcbName++;
}
return sum;
}
日時フォーマット
FATでは日付を2バイト、時間を2バイトで表します。そのフォーマットは次のとおりです。
- 日付フォーマット
-
9 - 15ビット :1980年からの経過年です。範囲は0~127で1980~2107年を表します。
5 - 8ビット :月です。範囲は1~12で1~12月を表します。
0 - 4ビット :日です。範囲は1~31で1~31日を表します。 - 時間フォーマット
-
11 - 15ビット :時間です。範囲は0~23で0~23時を表します。
5 - 10ビット :分です。範囲は0~59で0~59分を表します。
0 - 4ビット :秒です。範囲は0~29で、2倍した0~58秒を表します。
コメント