在上一章節《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檔案內容如果對檔案內容的讀取不大理解,暫時不需要深究,只要知道fat12檔案系統是通過fat表來將不同扇區的檔案資料組織起來的,也就是資料結構中的單鏈表思想。如上便是text.txt檔案中的內容。
總結: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格式的磁碟檔案。我們先來看看檔案分配表的資料格式,檔...