ディレクトリーエントリーと日時フォーマット | FAT

目次

ディレクトリーエントリーとは

ディレクトリーエントリーはファイルやディレクトリー(フォルダー)の属性情報(ファイル名、サイズ、作成日時)を記録する構造体情報です。1エントリーは32バイト固定長で、ファイルの一種としてみなされます。またファイルの先頭クラスター番号も記録しており、ファイルの実データが格納されている領域の開始位置を示します。これを辿ることで、ファイルの全データにアクセスできます。ディレクトリエントリーはファイルシステムがファイルを効率的に管理し、ユーザーがファイルにアクセスできるようにするために不可欠な要素です。

短いファイル名のディレクトリーエントリー

下記表は短いファイル名(SFN)のディレクトリーエントリー構造です。

スクロールできます
名前オフセット
[バイト]
サイズ
[バイト]
内容
DIR_Name011ベース名と拡張子です。ドットは記録しません。
DIR_Attr111ファイル属性です。
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_NTRes121Windows NT用の予約値です。0を設定します。
DIR_CrtTimeTenth131ファイル作成時の10ミリ秒単位のタイムスタンプです。DIR_CrtTimeは2秒周期の時間しか保存できません。本フィールドではさらに細かい(0~199)×10ミリ秒の時間を表します。
DIR_CrtTime142ファイルを作成した時間です。(※1)
DIR_CrtDate162ファイルを作成した日付です。(※1)
DIR_LstAccDate182ファイルを最後に開いた日付です。(※1)
書き込みの場合は、DIR_WrtTimeと同じ日付に設定する必要があります。
DIR_FstClusHI202ファイルの先頭クラスター番号の上位16ビットです。ファイルの実データが格納されている領域の開始位置を表します。FAT12またはFAT16の場合は0です。
DIR_WrtTime222ファイルの最終書き込み時間です。(※1)
ファイルの作成は書き込みとみなされます。
DIR_WrtDate242ファイルの最終書き込み日付です。(※1)
ファイルの作成は書き込みとみなされます。
DIR_FstClusLO262ファイルの先頭クラスター番号の下位16ビットです。
DIR_FileSize284ファイルのサイズ [バイト] です。

※1:フォーマットは以降の「日時フォーマット」を参照ください。

長いファイル名のディレクトリーエントリー

下記表は長いファイル名(LFN)のディレクトリーエントリー構造です。1つのディレクトリーエントリーに格納できるファイル名は13文字です。したがって最大255文字のファイル名を格納するには「255/13≒19.6」で20個のディレクトリーエントリーが必要になります。また一連のLFNディレクトリーエントリーには、1つのSFNディレクトリーエントリーが付随します。

スクロールできます
名前オフセット
[バイト]
サイズ
[バイト]
内容
LDIR_Ord01このLFNディレクトリーエントリーが全体のどの部分であるかを示します。[1~20]
1がLFNディレクトリーエントリーの先頭を表します。また0x40(LAST_LONG_ENTRY)フラグが立っていると、それがLFNディレクトリーエントリーの最後であることを表します。
LDIR_Name1110名前の1~5文字目です。UTF-16LEで格納されます。
LDIR_Attr111SFN表のDIR_Attrと同じです。
LDIR_Type121「0」である必要があり、それがLFNのディレクトリーエントリーであることを表します。
LDIR_Chksum131本ディレクトリーエントリーのチェックサムです。
LDIR_Name21412名前の6~11文字目です。
LDIR_FstClusLO262既存のディスクユーティリティとの互換性のために「0」である必要があります。
LDIR_Name3284名前の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秒を表します。

FATファイルシステム上で保存する時間は2秒周期となります。

コメント

コメントする

CAPTCHA


目次