バックナンバーはこちら。
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のディレクトリエントリを参照し、
クラスタ番号を読み出す。
![ディレクトリエントリ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)

確か、DIR_FstClusHIとDIR_FstClusLOを見ればいいから、
このディレクトリエントリの実体はクラスタ7にいるってことだね。

さらに、ルートディレクトリエントリがクラスタ2で0x90000。
1クラスタが4096[byte]。
よって、
0x90000+(7-2)*4096=610304[byte]
610304[byte]目を参照すれば良いってことか。

その通り!
クラスタ7参照

とりえあずクラスタ7はこんな感じになってる。
![クラスタ7、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_クラスタ7-1024x358.png)

んー?
なんかファイル名が入ってるはずのDIR_Nameが「.」だけだね?
ファイル名が「8.3形式」じゃないからLFN独自の仕様?

いや、なんか違うな・・・。
LFN仕様だとすると、DIR_Attrが0x0fになってなるはずだけど、
ここではDIR_Attrが0x10でディレクトリってことになってるな・・・。

どういうこと??
ルートディレクトリ以外のディレクトリのルール

あー、「.」ってフォルダと「..」ってフォルダが存在するって状態だね。

「.」と「..」?
そんなフォルダあったっけ?

「.」がカレントディレクトリを指示している。
今いるディレクトリだね。
「..」が親ディレクトリを指示している。
今回の場合だとルートディレクトリになる。

ほー。
そんな仕様があるのかー。
「..」で親ディレクトリが分かるってのは重要かも。
相対PATHとかで使いそうだもんね。

その通り。
ファイルシステムは絶対PATHの他に相対PATH指定もあるんで、
それに対応した仕様になってないといけない。

うん。
結構しっかり考えられてるんだねー。
まとめ

まとめだよ。
- ディレクトリエントリが指し示すフォルダの中のデータはフォルダ内のディレクトリエントリ。
- つまり入れ子になっている。
- ルートディレクトリ以外のディレクトリは「.」と「..」の名称のディレクトリが存在。
- 「.」がカレントディレクトリ。
- 「..」が親ディレクトリ。
- 相対PATH用の仕様。
バックナンバーはこちら。
コメント