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

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

バックナンバーはこちら。
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; };
太郎くん
太郎くん

確か、DIR_FstClusHIDIR_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; };
太郎くん
太郎くん

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

太郎くん
太郎くん

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

太郎くん
太郎くん

どういうこと??

ルートディレクトリ以外のディレクトリのルール

フクさん
フクさん

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

太郎くん
太郎くん

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

フクさん
フクさん

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

太郎くん
太郎くん

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

フクさん
フクさん

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

太郎くん
太郎くん

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

まとめ

フクさん
フクさん

まとめだよ。

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

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

コメント

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