バックナンバーはこちら。
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つ埋まってるんで、連続でバイナリエディタの画像を貼るよ。
5つ?!
あれ?
おかしくない?!
確かルートディレクトリには「long_file_name_folder」ってフォルダを追加しただけだよね?
とすると、元々あったtest.txtとtest2.txtを加えて3つになるんじゃないの?
これがVFAT仕様に組み込まれたLFN(Long File Name)仕様の影響だね。
ということは、
ディレクトリエントリで追加された3つで「long_file_name_folder」フォルダを表現してるってこと?
その通り。
ディレクトリエントリ確認
まずは3つ目のディレクトリエントリを再度見てみよう。
この中の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エントリ)の場合。
とりあえず、ロングファイルネーム用のディレクトリエントリ構造体で参照し直すと以下になる。
全然構造が違う!!
しかも、ファイル名が埋まってるLDIR_NAME1、LDIR_NAME2、LDIR_NAME3ってのがあるのだが、
ロングファイルネームの時はUnicodeになる。
今までのFAT32ではasciiだったんだけどね。
結構違う?!
ここら辺のファイル名の埋まり方も癖があるんで、次回はそこの話からだねー。
(意外と魔境な予感・・・。)
まとめ
まとめだよ。
- ロングファイルネームなフォルダやファイルのディスクイメージ上で確認を試みる。
- まずはルートディレクトリエントリから。
- 存在するファイルとフォルダが3つのはずだが、ディレクトリエントリとしては5つ存在。
- 5つのうち3つがロングファイルネーム仕様を満たす仕掛け。
- ファイル名もasciiからUnicodeになってる。
バックナンバーはこちら。
コメント