バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-external-storage-backnumber/
はじめに
FatFsのファイル上シミュレーションの話。
ロングファイルネームなフォルダやファイルをディスクイメージ上で確認する場合の読み方。
フォルダの中を見ていく。
登場人物
博識フクロウのフクさん
![指差しフクロウ](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
![技術者太郎](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
フォルダの中のデータ?
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
今回は、フォルダの中を見ていくんだよね?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
そうだね。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」20アップ.png)
フォルダの中って、結局はデータというより
ファイル、フォルダが並んでるだけなんだけど、
どういう感じで繋がるんだろう?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
簡単に言うと、
ディレクトリエントリが指し示しているクラスタ番号に
下位のディレクトリエントリが埋まってる。
って感じ。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
あ、ファイルの時はファイルの中身のデータだったものが、
フォルダの場合はディレクトリエントリになるって感じか。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
そうそう。
実際に見ていけばイメージ湧くんじゃないかなー?
ディレクトリで指名してるクラスタ番号
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まずは「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)
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
確か、DIR_FstClusHIとDIR_FstClusLOを見ればいいから、
このディレクトリエントリの実体はクラスタ7にいるってことだね。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
さらに、ルートディレクトリエントリがクラスタ2で0x90000。
1クラスタが4096[byte]。
よって、
0x90000+(7-2)*4096=610304[byte]
610304[byte]目を参照すれば良いってことか。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/まるフクロウ.png)
その通り!
クラスタ7参照
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
とりえあずクラスタ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)
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
んー?
なんかファイル名が入ってるはずのDIR_Nameが「.」だけだね?
ファイル名が「8.3形式」じゃないからLFN独自の仕様?
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」20アップ.png)
いや、なんか違うな・・・。
LFN仕様だとすると、DIR_Attrが0x0fになってなるはずだけど、
ここではDIR_Attrが0x10でディレクトリってことになってるな・・・。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」10アップ.png)
どういうこと??
ルートディレクトリ以外のディレクトリのルール
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
あー、「.」ってフォルダと「..」ってフォルダが存在するって状態だね。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
「.」と「..」?
そんなフォルダあったっけ?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
「.」がカレントディレクトリを指示している。
今いるディレクトリだね。
「..」が親ディレクトリを指示している。
今回の場合だとルートディレクトリになる。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
ほー。
そんな仕様があるのかー。
「..」で親ディレクトリが分かるってのは重要かも。
相対PATHとかで使いそうだもんね。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/まるフクロウ.png)
その通り。
ファイルシステムは絶対PATHの他に相対PATH指定もあるんで、
それに対応した仕様になってないといけない。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
うん。
結構しっかり考えられてるんだねー。
まとめ
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まとめだよ。
- ディレクトリエントリが指し示すフォルダの中のデータはフォルダ内のディレクトリエントリ。
- つまり入れ子になっている。
- ルートディレクトリ以外のディレクトリは「.」と「..」の名称のディレクトリが存在。
- 「.」がカレントディレクトリ。
- 「..」が親ディレクトリ。
- 相対PATH用の仕様。
バックナンバーはこちら。
コメント