【FatFs】車載外部ストレージ その107【ファイル上シミュレーション⑭】

【FatFs】車載外部ストレージ その107【ファイル上シミュレーション⑭】 車載外部ストレージ

バックナンバーはこちら。
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]なんで大きさは一緒だ。

太郎くん
太郎くん

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

フクさん
フクさん

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

ロングファイルネームが入ったディレクトリエントリ、test.txt、test.txt(ascii文字列)、test2.txt、TEST2.TXT(ascii文字列)、long_file_name_folder2(LFN)、e_foler、long_file_name_folder1(LFN)、long_file_nam、long_file_name_folder、(unicode文字列)、long_filename_folder1(SFN)、LONG_F~1.TXT(ascii文字列)
太郎くん
太郎くん

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

フクさん
フクさん

LFNLong File Name。
SFNShort 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にフォルダ内のディレクトリエントリの先頭クラスタが埋まっている。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました