バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-external-storage-backnumber/
はじめに
FatFsのファイル上シミュレーションの話。
前回、ロングファイルネームなフォルダやファイルをFatFsで作ったので、
ディスクイメージを確認してみる。
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
ロングファイルネームなフォルダやファイルのディスクイメージ上で確認

前回、ロングファイルネームなフォルダやファイルを作ったから
それをディスクイメージで確認だね。

そうだね。
前回やったのは以下。
- 「long_file_name_folder」というフォルダを作った。
- そのフォルダ中に「long_file_name_file.txt」を作った。
フォルダもファイルも共に「8.3形式」では無いのでロングファイルネームってことになる。
ルートディレクトリエントリ確認

ルートディレクトリエントリの場所は変わってないはずだから
ディスクイメージの0x90000[byte]目を見ればOKだね。

ルートディレクトリエントリはこんな感じだ。
ディレクトリエントリとしては合計で5つ埋まってるんで、連続でバイナリエディタの画像を貼るよ。
![ディレクトリエントリtestファイル、struct DIR_ENTRY_t { BYTE DIR_Name[11]; BYTE DIR_Attr; BYTE DIR_NTRes; BYTE DIR_CrtTimeTenth; WORD DIR_CrtTime; WORD DIR_CrtDate; WORD DIR_LstAccDate; WORD DIR_FstClusHI; WORD DIR_WrtTime; WORD DIR_WrtDate; WORD DIR_FstClusLO; DWORD DIR_FileSize; };](https://www.simulationroom999.com/blog/wp-content/uploads/2021/04/02_ディレクトリエントリtestファイル-1024x357.png)
![ディレクトリエントリtest2ファイル、struct DIR_ENTRY_t { BYTE DIR_Name[11]; BYTE DIR_Attr; BYTE DIR_NTRes; BYTE DIR_CrtTimeTenth; WORD DIR_CrtTime; WORD DIR_CrtDate; WORD DIR_LstAccDate; WORD DIR_FstClusHI; WORD DIR_WrtTime; WORD DIR_WrtDate; WORD DIR_FstClusLO; DWORD DIR_FileSize; };](https://www.simulationroom999.com/blog/wp-content/uploads/2021/04/03_ディレクトリエントリtest2ファイル-1024x361.png)
![ディレクトリエントリLFN2ファイル、struct DIR_ENTRY_t { BYTE DIR_Name[11]; BYTE DIR_Attr; BYTE DIR_NTRes; BYTE DIR_CrtTimeTenth; WORD DIR_CrtTime; WORD DIR_CrtDate; WORD DIR_LstAccDate; WORD DIR_FstClusHI; WORD DIR_WrtTime; WORD DIR_WrtDate; WORD DIR_FstClusLO; DWORD DIR_FileSize; };](https://www.simulationroom999.com/blog/wp-content/uploads/2021/04/04_ディレクトリエントリLFN2ファイル-1024x360.png)
![ディレクトリエントリLFN1ファイル、struct DIR_ENTRY_t { BYTE DIR_Name[11]; BYTE DIR_Attr; BYTE DIR_NTRes; BYTE DIR_CrtTimeTenth; WORD DIR_CrtTime; WORD DIR_CrtDate; WORD DIR_LstAccDate; WORD DIR_FstClusHI; WORD DIR_WrtTime; WORD DIR_WrtDate; WORD DIR_FstClusLO; DWORD DIR_FileSize; };](https://www.simulationroom999.com/blog/wp-content/uploads/2021/04/05_ディレクトリエントリLFN1ファイル-1024x361.png)
![ディレクトリエントリSFN1ファイル、struct DIR_ENTRY_t { BYTE DIR_Name[11]; BYTE DIR_Attr; BYTE DIR_NTRes; BYTE DIR_CrtTimeTenth; WORD DIR_CrtTime; WORD DIR_CrtDate; WORD DIR_LstAccDate; WORD DIR_FstClusHI; WORD DIR_WrtTime; WORD DIR_WrtDate; WORD DIR_FstClusLO; DWORD DIR_FileSize; };](https://www.simulationroom999.com/blog/wp-content/uploads/2021/04/06_ディレクトリエントリSFN1ファイル-1024x362.png)

5つ?!
あれ?
おかしくない?!
確かルートディレクトリには「long_file_name_folder」ってフォルダを追加しただけだよね?
とすると、元々あったtest.txtとtest2.txtを加えて3つになるんじゃないの?

これがVFAT仕様に組み込まれたLFN(Long File Name)仕様の影響だね。

ということは、
ディレクトリエントリで追加された3つで「long_file_name_folder」フォルダを表現してるってこと?

その通り。
ディレクトリエントリ確認

まずは3つ目のディレクトリエントリを再度見てみよう。
![ディレクトリエントリLFN2ファイル、struct DIR_ENTRY_t { BYTE DIR_Name[11]; BYTE DIR_Attr; BYTE DIR_NTRes; BYTE DIR_CrtTimeTenth; WORD DIR_CrtTime; WORD DIR_CrtDate; WORD DIR_LstAccDate; WORD DIR_FstClusHI; WORD DIR_WrtTime; WORD DIR_WrtDate; WORD DIR_FstClusLO; DWORD DIR_FileSize; };](https://www.simulationroom999.com/blog/wp-content/uploads/2021/04/04_ディレクトリエントリLFN2ファイル-1024x360.png)

この中のDIR_Attrというパラメータに着目してみよう。

0x0Fってのがあるね。
そもそもDIR_Attrの内訳ってどうなってるの?

こうなってるね。
0x01: ATTR_READ_ONLY (書き込み禁止)
0x02: ATTR_HIDDEN (隠し)
0x04: ATTR_SYSTEM (システム)
0x08: ATTR_VOLUME_ID (ボリュームラベル)
0x10: ATTR_DIRECTORY (ディレクトリ)
0x20: ATTR_ARCHIVE (アーカイブ)
0x0F: ATTR_LONG_FILE_NAME (LFNエントリ)

0x0FだからATTR_LONG_FILE_NAME (LFNエントリ)ってことになるのか。

ここで特殊仕様が発動!
DIR_AttrがATTR_LONG_FILE_NAME (LFNエントリ)の場合、
LFN用の構造体で該当ディレクトリエントリを解釈し直す!

は?
ロングファイルネームのディレクトリエントリ確認

ロングファイルネーム用のディレクトリエントリ構造体があるんだよ。
切り替える条件がさっきも言った通り、DIR_AttrがATTR_LONG_FILE_NAME (LFNエントリ)の場合。
とりあえず、ロングファイルネーム用のディレクトリエントリ構造体で参照し直すと以下になる。
![ロングファイルネームのディレクトリエントリ確認、struct LFN_DIR_ENTRY_t { BYTE LDIR_Ord; BYTE LDIR_NAME1[10]; BYTE LDIR_Attr; BYTE LDIR_Type; BYTE LDIR_Chksum; BYTE LDIR_Name2[12]; WORD LDIR_FstClusLO; BYTE LDIR_Name3[4]; };](https://www.simulationroom999.com/blog/wp-content/uploads/2021/04/ロングファイルネームのディレクトリエントリ-1024x354.png)

全然構造が違う!!

しかも、ファイル名が埋まってるLDIR_NAME1、LDIR_NAME2、LDIR_NAME3ってのがあるのだが、
ロングファイルネームの時はUnicodeになる。
今までのFAT32ではasciiだったんだけどね。

結構違う?!

ここら辺のファイル名の埋まり方も癖があるんで、次回はそこの話からだねー。

(意外と魔境な予感・・・。)
まとめ

まとめだよ。
- ロングファイルネームなフォルダやファイルのディスクイメージ上で確認を試みる。
- まずはルートディレクトリエントリから。
- 存在するファイルとフォルダが3つのはずだが、ディレクトリエントリとしては5つ存在。
- 5つのうち3つがロングファイルネーム仕様を満たす仕掛け。
- ファイル名もasciiからUnicodeになってる。
バックナンバーはこちら。
コメント