第四載 FAT12檔案系統剖析2

2021-10-05 16:05:05 字數 3222 閱讀 5301

在上一章節《fat12檔案系統剖析1》中,我們把a.img啟動軟盤使用freedos系統格式化為fat12檔案系統的組織方式,並且向a.img軟盤寫入兩個檔案,同時通過freedos作業系統也檢視了a.img軟盤中的檔案。之所以這麼做,是因為主引導程式不可以超過512位元組,所以主引導程式需要在基本的初始化工作完成後載入啟動介質(這裡是軟盤a.img)中的啟動程式到記憶體,然後跳轉到對應記憶體處執行。

上一節我們是通過freedos作業系統來檢視a.img軟盤中fat12根目錄的目標檔案,那麼在程式中我們怎去判斷目標檔案是否存在fat12根目錄中?要解決這個問題,我們首先來了解fat12的根目錄在檔案系統中的位置

上圖中直接給了計算根目錄大小的公式:根目錄個數*每個根目錄項大小/每個扇區大小= 根目錄占用的扇區數量,

其中根目錄個數在上一章節我們已經求出,為0xe0,十進位制為224,不熟悉的可以參考上一章節。每個根目錄項大小為32位元組,每個扇區大小為512位元組,那麼有 224 * 32 / 512 = 14,即根目錄檔案項在fat12檔案系統中總共占用14個扇區,也就是7168位元組。

除了上邊說的根目錄區,我們還需要了解下根目錄項,根目錄由根目錄項組成,上文中的224,就是fat12檔案系統有224個根目錄項,乙個根目錄項代表根目錄中的乙個檔案索引,每個根目錄項中,包含了這個檔案的基本資訊,如下:

下邊需要做的實驗,便是讀取fat12中每個根目錄項的內容並列印(**在上章**基礎上增加更目錄項的列印)

#pragma pack(1)

struct fat12header

;//根目錄項結構體

struct rootentry

;#pragma pack(pop)

void printheader(fat12header& rf, qstring p)

file.close();

}//獲取乙個根目錄項

rootentry findrootentry(fat12header& rf, qstring p, int i)

}; qfile file(p);

//bpb_rootentcnt為最大根目錄檔案數

if( file.open(qiodevice::readonly) && (0 <= i) && (i < rf.bpb_rootentcnt) )

file.close();

return ret; //返回讀取到的根目錄項

}//獲取指定檔名的根目錄項

rootentry findrootentry(fat12header& rf, qstring p, qstring fn)

}; for(int i=0; i= 0 )

}else}}

}return ret;

}//列印根目錄項

void printrootentry(fat12header& rf, qstring p)

;//根目錄項結構體

struct rootentry

;#pragma pack(pop)

void printheader(fat12header& rf, qstring p)

file.close();

}//獲取乙個根目錄項

rootentry findrootentry(fat12header& rf, qstring p, int i)

}; qfile file(p);

//bpb_rootentcnt為最大根目錄檔案數

if( file.open(qiodevice::readonly) && (0 <= i) && (i < rf.bpb_rootentcnt) )

file.close();

return ret; //返回讀取到的根目錄項

}//獲取指定檔名的根目錄項

rootentry findrootentry(fat12header& rf, qstring p, qstring fn)

}; for(int i=0; i= 0 )

}else}}

}return ret;

}//列印根目錄項

void printrootentry(fat12header& rf, qstring p)

}file.close();

delete fat;

return ret;

}//獲取檔案內容

qbytearray readfilecontent(fat12header& rf, qstring p, qstring fn)

; qdatastream in(&file);

int count = 0;

ret.resize(re.dir_filesize);

//遍歷所有簇獲取檔案內容

for(int i=0, j=re.dir_fstclus; j<0xff7; i+=512, j=vec[j])

{//定位到檔案資料扇區(33區),資料區起始位址對應編號為2,所以要-2

file.seek(rf.bpb_bytspersec * (33 + j - 2));

in.readrawdata(buf, sizeof(buf));

for(uint k=0; k

main函式中呼叫讀取檔案內容函式readfilecontent,讀取test.txt檔案內容

如上便是text.txt檔案中的內容。

如果對檔案內容的讀取不大理解,暫時不需要深究,只要知道fat12檔案系統是通過fat表來將不同扇區的檔案資料組織起來的,也就是資料結構中的單鏈表思想。

總結:1、fat12根目錄記錄了檔案的檔名起始簇號檔案長度

2、通過查詢根目錄區能夠確定是否存在目標檔案

3、fat12檔案資料離散的分布於儲存介質不同的扇區中

4、檔案資料通過fat表進行關聯,採用了單鏈表的思想

學自 --《狄泰軟體學院》- 門徒作業系統

FAT12檔案系統總結

一 fat12 檔案系統 12位檔案分配表 檔案系統 邏輯層,不關心物理的儲存位置,將資料快抽象成線性的可隨機訪問的,從0開始的陣列 二 層次 扇區 最小單元,512位元組 引導扇區 0扇區 bpb biso paremeter block 簇 資料區儲存檔案資料的基本單位,包含乙個或多個扇區,2的...

檔案系統 FAT12

fat12是dos時代使用的檔案系統,適用於軟盤等小容量儲存介質。其特點 小容量,最大為4.1mb 以簇為單位,最大簇數4084 每個fat表項佔12bits,所以稱之為fat12 每個扇區預設512位元組 根據容量不同,每個簇有1至4個扇區。fat表2 如果存在 是fat表1的備份。根目錄最多包涵...

FAT12檔案系統之資料儲存方式詳解

fat12檔案系統之資料儲存方式詳解 位址是 同時,也編寫了乙個簡單的引導程式來驗證了這個引導扇區的資料結構,詳情 位址是 下面我們來詳細了解一下fat檔案分配表 根目錄 使用者資料的資料結構,只有通過詳細分析這些資料結構,才能自由的訪問fat12格式的磁碟檔案。我們先來看看檔案分配表的資料格式,檔...