如何从文件系统中读取文件内容
生活随笔
收集整理的這篇文章主要介紹了
如何从文件系统中读取文件内容
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【0】寫在前面
0.0) text description from orange’s implemention of a os ,文末總結系個人臆測出的干貨
【1】intro to FAT12(file allocation table 12)文件系統格式(from Baidu Baike)
- (1)FAT12定義: FAT12是DOS時代就開始使用的文件系統(File System),直到2009年仍然在軟盤上使用。
- (2)FAT12的主磁盤結構:
- 2.1)引導扇區(Boot Sector):位于第一個扇區,在軟盤上就是0柱面(磁道)0磁頭1扇區。
- 2.2)文件分配表(FAT):緊接著引導扇區的是兩個完全相同的FAT表,每個FAT表占用9個(FAT2是FAT1 的 copy)
- 2.3)根目錄區: FAT表之后是根目錄區,根目錄區長度不固定
- 2.4)數據區:根目錄后面就是數據區
【2.1】FAT12的引導扇區格式:
名稱 開始字節 長度 內容 參考值 BS_jmpBOOT 0 3 一個短跳轉指令 jmp Label_07c00H nop BS_OEMName 3 8 廠商名 'QingFeng' BPB_BytesPerSec 11 2 每扇區字節數(Bytes/Sector) 0x200 BPB_SecPerClus 13 1 每簇扇區數(Sector/Cluster) 0x1 BPB_ResvdSecCnt 14 2 Boot記錄占用多少扇區 ox1 BPB_NumFATs 16 1 共有多少FAT表 0x2 BPB_RootEntCnt 17 2 根目錄區文件最大數 0xE0 BPB_TotSec16 19 2 扇區總數 0xB40[2*80*18] BPB_Media 21 1 介質描述符 0xF0 BPB_FATSz16 22 2 每個FAT表所占扇區數 0x9 BPB_SecPerTrk 24 2 每磁道扇區數(Sector/track) 0x12 BPB_NumHeads 26 2 磁頭數(面數) 0x2 BPB_HiddSec 28 4 隱藏扇區數 0 BPB_TotSec32 32 4 如果BPB_TotSec16=0,則由這里給出扇區數 0 BS_DrvNum 36 1 INT 13H的驅動器號 0 BS_Reserved1 37 1 保留,未使用 0 BS_BootSig 38 1 擴展引導標記(29h) 0x29 BS_VolID 39 4 卷序列號 0 BS_VolLab 43 11 卷標 'QingFeng' BS_FileSysType 54 8 文件系統類型 'FAT12' 引導代碼及其他內容 62 448 引導代碼及其他數據 引導代碼(剩余空間用0填充) 結束標志0xAA55 510 2 第510字節為0x55,第511字節為0xAA 0xAA55【2.2】文件分配表-FAT
- a)FAT的作用:當文件size 大于 512B,則FAT是找出該文件所占用的簇(簇:一個或多個扇區,引導扇區的BPB_SecPerClus記錄該數字)
- b)FAT項:每個項占用12 位,代表一個簇,第0和1個簇不使用,從第2個FAT項 開始表示數據區的每一個簇,即是第2個FAT項表示數據區第一個簇。數據區的第一個簇號是2,和這里是呼應的 。(注意: FAT項值代表的是文件的下一個簇號)
看個荔枝(只看16個字節):(干貨)
如FAT所在扇區(一個扇區512字節)存儲值為:F0 FF FF FF 8F 00 FF FF FF FF FF FF 09 A0 00 FF , 0F 00 00 ; 則簇號分別為:0-FF0 1-FFF 2-FFF 3-008 4-FFF 5-FFF 6-FFF 7-FFF 8-009 9-00A A-FFF如果根目錄去中有條目記載某文件A 的 DIR_FstClus=3的話,則對應第3個FAT項,結合上一行,我們知道FAT3==008,所以下一個簇號是8-009 , 以此類推9-00A、 A-FFF。FFF就表示這個簇是最后一個簇了。
【2.3】根目錄區-root dir sector
- a)根目錄區中的每一個條目占用32字節,每個條目格式如下:
- b)根目錄區的大小依賴于 BPB_RootEntCnt(引導扇區中的BPB_RootEntCnt,根目錄區文件最大數==根目錄條目數),所以長度不固定;
如何計算根目錄區的扇區數量?
顯然,BPB_RootEntCnt 和 BPB_BytePerSec 都是由軟盤(文件系統FAT12所在的分區)的引導扇區提供的;
所以,我們可以算出該軟盤的根目錄扇區數量。
【2.4】數據區
- a)數據區的第一個簇的簇號是2,而不是0 or 1;
【3】下面,我們講一下,如何從文件系統中讀取一個文件的內容(讀取某文件的步驟)(純屬個人臆測,干貨):
- a)應用程序給出文件名;
- b)通過該分區(文件系統)的引導扇區算出 根目錄目錄 所占扇區大小 和 數據區的起始扇區;
- c)依據app 給出的文件名 和 根目錄項的DIR_Name 定位該文件名對應的根目錄項(根目錄條目);
- d)該條目記錄了 對應文件的起始簇號,并將 該簇號 送到 FAT1 以找出該文件的占用的所有簇號;(FAT2 是 FAT1 的copy)
- e)拿到該文件的所有簇號后,依據步驟a)算出的數據區起始扇區,從數據區中 取出 這些簇號里的內容,至此,取出該文件的內容;
總結
以上是生活随笔為你收集整理的如何从文件系统中读取文件内容的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分页机制总结
- 下一篇: 怎么把网站关联到万网(到万网如何注册网站