バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-external-storage-backnumber/
はじめに
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
ロングファイルネームなフォルダやファイルのディレクトリエントリの関係性

前回、ディスクイメージを見た際に
ファイル、フォルダが3つのはずなのに5つのディレクトリエントリがあった。
通常のFATであれば、ファイル、フォルダの合計数とディレクトリエントリの数は一致するが、これが異なっていたってところだ。

DIR_Attrを見てディレクトリエントリの構造体をロングファイルネーム用に切り替えるって話があったけど、
その構造体がそもそもディレクトリエントリ3つ分の大きさとか?

いんや。
ロングファイルネーム用ディレクトリエントリの構造体も32[byte]なんで大きさは一緒だ。

うーん、ますますわからん。

まぁ一旦各ディレクトリエントリの関係性を図示してみたので、
それを確認してみよう。


おー?
ロングファイルネーム用の3つのうち、2つがLFNで1つがSFN?
LFNとSFNって何?

LFNがLong File Name。
SFNがShort File Name。

もしかして、VFAT未対応FileSystemで表示される「~1」的ファイル名ってSFNに入ってるファイル名になるの?

その通り。

そして、それとは別にロングファイル名の領域が13文字あたり32byteずつ使用されるってことでOK?

OKだ。
LFN領域とSFN領域の関係性

図解してるのを見た感じだと、
一番下にSFNがいて、ロングファイルネームの名称はSFNの一個上のディレクトリエントリから順番に並んでるけど、
これって何かで決まってたりするの?
今回、たまたまこういう並びになってたりとか?

あー、この並びは決まった並びだね。
別のところでSFNとLFNの紐づけとかはしてなくて、
LFNがフォルダ/ファイル名の後方から配置されて行って、最後にSFN用のディレクトリエントリが必ず配置される。

ほう。そこはシンプルになってるんだねー。

VFAT未対応FileSystemの場合はロングファイルネームは識別できないので、LFN領域はスキップしていって、最終的にSFNを発見。
その中に記載されているファイル名を認識するって流れだ。

中々予想よりややこしいが、知ってしまえば割とシンプルかなって印象だ。

この関係性はフォルダ、ファイル共に一緒だね。
違いがあるのはSFNのところのDIR_Attrが
- ATTR_ARCHIVE(アーカイブ)
- ATTR_DIRECTORY (ディレクトリ)
の違いだけだ

うん。そこはなんとなくわかる。

SFNの中にディレクトリの内部にあるディレクトリエントリの先頭クラスタ番号が埋まってるんで、
そこを見ることでlong_file_name_folderの内部ファイル、フォルダが確認できる。
というわけで次回はlong_file_name_folderの中身を追っていこう。
まとめ

まとめだよ。
- ロングファイルネームなフォルダやファイルのディレクトリエントリの関係性を確認。
- LFNが先に現れ、最後にSFN。
- VFAT未対応FileSystemはLFNをスキップしてSFNだけを参照している。
- SFNにフォルダ内のディレクトリエントリの先頭クラスタが埋まっている。
- LFNが先に現れ、最後にSFN。
バックナンバーはこちら。
コメント