バックナンバーはこちら。
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
フォルダの中のデータ?
今回は、フォルダの中を見ていくんだよね?
そうだね。
フォルダの中って、結局はデータというより
ファイル、フォルダが並んでるだけなんだけど、
どういう感じで繋がるんだろう?
簡単に言うと、
ディレクトリエントリが指し示しているクラスタ番号に
下位のディレクトリエントリが埋まってる。
って感じ。
あ、ファイルの時はファイルの中身のデータだったものが、
フォルダの場合はディレクトリエントリになるって感じか。
そうそう。
実際に見ていけばイメージ湧くんじゃないかなー?
ディレクトリで指名してるクラスタ番号
まずは「long_file_name_folder」のSFNのディレクトリエントリを参照し、
クラスタ番号を読み出す。
確か、DIR_FstClusHIとDIR_FstClusLOを見ればいいから、
このディレクトリエントリの実体はクラスタ7にいるってことだね。
さらに、ルートディレクトリエントリがクラスタ2で0x90000。
1クラスタが4096[byte]。
よって、
0x90000+(7-2)*4096=610304[byte]
610304[byte]目を参照すれば良いってことか。
その通り!
クラスタ7参照
とりえあずクラスタ7はこんな感じになってる。
んー?
なんかファイル名が入ってるはずのDIR_Nameが「.」だけだね?
ファイル名が「8.3形式」じゃないからLFN独自の仕様?
いや、なんか違うな・・・。
LFN仕様だとすると、DIR_Attrが0x0fになってなるはずだけど、
ここではDIR_Attrが0x10でディレクトリってことになってるな・・・。
どういうこと??
ルートディレクトリ以外のディレクトリのルール
あー、「.」ってフォルダと「..」ってフォルダが存在するって状態だね。
「.」と「..」?
そんなフォルダあったっけ?
「.」がカレントディレクトリを指示している。
今いるディレクトリだね。
「..」が親ディレクトリを指示している。
今回の場合だとルートディレクトリになる。
ほー。
そんな仕様があるのかー。
「..」で親ディレクトリが分かるってのは重要かも。
相対PATHとかで使いそうだもんね。
その通り。
ファイルシステムは絶対PATHの他に相対PATH指定もあるんで、
それに対応した仕様になってないといけない。
うん。
結構しっかり考えられてるんだねー。
まとめ
まとめだよ。
- ディレクトリエントリが指し示すフォルダの中のデータはフォルダ内のディレクトリエントリ。
- つまり入れ子になっている。
- ルートディレクトリ以外のディレクトリは「.」と「..」の名称のディレクトリが存在。
- 「.」がカレントディレクトリ。
- 「..」が親ディレクトリ。
- 相対PATH用の仕様。
バックナンバーはこちら。
コメント