FAT32格式文件系统创建TXT
目录
本人并非计算机专业,如有用词不准请谅解。按照本文步骤一步步执行即使新手也可完成简单文本文档的创建。
你需要的东西
1个格式化好的U盘(不要勾选快速格式化)
1个PC
winhex.exe完全版
你最少要知道的信息
小端模式
重点内容:数据的高字节保存在内存的高地址
其余内容可自行查阅百度百科:大小端模式,或以其他渠道学习
硬盘组成
FAT32文件系统由以下四部分组成:
DBR区 | 保留扇区 | FAT区 | 数据区 |
---|
以下的“只读”和“读写”是我们需要的操作,实际上磁盘的任何位置都可以读写。
DBR区
(前512个字节)——用于查找FAT1区、FAT2区、数据区开头
只读
地址 | 长度 | 定义 | 我的U盘 |
---|---|---|---|
0x0B-0x0C | 2 | 每扇区字节数 | 512 |
0x0D | 1 | 每簇扇区数 | 8 |
0x0E-0x0F | 2 | DOS保留扇区数 | 3032 |
0x10 | 1 | FAT个数 | 2 |
0x24-0x27 | 4 | 每FAT扇区数 | 14868 |
0x2C-0x2F | 4 | 根目录首簇号 | 2 |
保留扇区
读+写
地址(绝对地址) | 长度(字节) | 定义 |
---|---|---|
0x3EC-0x3EF | 4 | 下一可用空簇号 |
此区域用于加快索引。
可以不使用,若要使用则要注意在索引后判断是否真的是空簇(根据FAT表判断)。
如果是空簇则使用后将其 赋新值!
如果不是空簇则在其簇号之后寻找空簇,使用后 赋新值 !
FAT表项
读+写
FAT表项 | 含义 |
---|---|
0x0000 0000 | 空闲簇,可用簇 |
0x0000 0001 | 保留簇 |
0x0000 0002 ~ 0x0FFF FFEF | 该簇已用,其值指向下一个簇号 |
0x0FFF FFF0 ~ 0X0FFF FFF6 | 这些值保留,不使用 |
0x0FFF FFF7 | 坏簇,当一个簇中有一个扇区损坏(如物理损坏、病毒感染)时称为坏簇,这个簇将不被FAT32使用 |
0x0FFF FFF8 ~ 0x0FFF FFFF | 文件的最后一个簇 |
注:
1.FAT32中不存在0号簇与1号簇,2号簇开始才有实际意义(2号簇一般为根目录),上表中分别为0-7号簇的使用信息
2.在根目录项超过一个簇时,申请一个空簇并把它链到根目录的FAT表上。(先将占满的根目录的FAT信息赋值为空簇的簇号,再将空簇的FAT信息赋值为0x0FFFFFFFF,最后在空簇上写入目录信息)
数据区
读+写
短目录:
字节偏移 | 长度(字节) | 定义 |
---|---|---|
0x0-0x7 | 8 | 文件名(E5开头则证明已经删除,20表示空) |
0x8-0xA | 3 | 扩展名 |
0xB | 2 | 属性 |
0xC | 1 | 系统保留 |
0xD | 1 | 创建时间的10毫秒位 |
0xE-0xF | 2 | 文件创建时间 |
0x10-0x11 | 2 | 文件创建日期 |
0x12-0x13 | 2 | 文件最后访问日期 |
0x14-0x15 | 2 | 文件起始簇号高16位 |
0x16-0x17 | 2 | 文件最近修改时间 |
0x18-0x19 | 2 | 文件最近修改日期 |
0x1A-0x1B | 2 | 文件起始簇号低16位 |
0x1C-0x1F | 4 | 表示文件的长度 |
其中0xB代表:
0xB |
---|
00000000B读写 |
00000001B只读 |
00000010B隐藏 |
00000100B系统 |
00001000B卷标 |
00010000B子目录 |
00100000B归档 |
00001111B长目录 |
时间
bit | 含义 |
---|---|
高5位 | 小时 |
中6位 | 分钟 |
低5位 | 2秒 |
日期
bit | 含义 |
---|---|
高7位 | 从1980年开始的年数 |
中4位 | 月 |
低5位 | 日 |
注:
1.每两行(32字节)相当于一个短目录
2.长目录在短目录前面,为32字节的整数倍(手动创建可以不创建长目录,自动创建时会有长目录短目录同时创建)
3.下一目录必须紧紧挨着上一目录,若出现字头为0x00则系统不再向下读取
例子
FAT表项含义举例
例如第二行第一组0x0FFFFFFF 代表第4簇(从0开始计数)的使用情况是文件的最后一个簇
短目录举例
下图为一个短目录,拆分其个位置含义
2020202020202031->1
545854->txt
20->属性:归档
10->系统保留
A5->10毫秒位 0xA5=165(1.650s)
B490->创建时间 10110(22时) 100100(36分) 10000(32秒)
4F7A->创建日期0100111(1980+39=2019年) 1011(11月) 11010(26日)
4F7B->最后访问日期(略)
0000->起始簇号高16位
7EA3->最近修改时间(略)
4F7B->最近修改日期(略)
0006->起始簇号低16位
0000000C->文件长度:12(在读取时仅读取到文件长度,之后的数据不会读取)
地址的计算公式
注:以下数据除“文件起始簇号”外均在“DBR区域”,“文件起始簇号”在“短目录”区域
FAT1表头地址=保留扇区数×每扇区字节数
FAT2表头地址=(保留扇区数+FAT1表扇区数)×每扇区字节数
FAT1表中簇首地址=保留扇区数×每扇区字节数+簇号×4
FAT2表中簇首地址=(保留扇区数+FAT1表扇区数)×每扇区字节数+簇号×4
数据区偏移=(保留扇区数+ FAT表扇区数× FAT表个数+(根目录首簇号-2)×每簇扇区数)×每扇区字节数
【当根目录首簇号为2时,数据区开始即为根目录】
文件起始地址偏移=(保留扇区数+ FAT表扇区数× FAT表个数+(文件起始簇号-2)×每簇扇区数)×每扇区字节数
例子
例子:
FAT1表地址=3032×512=0x17B000
FAT1表中第5簇首地址=3032×512+4×5=0x17B014
FAT2表地址=(3032+14868)×512=0x8BD800
FAT2表中第5簇首地址=3032×512+4×5=0x8BD814
根位置=(3032+14868×2+(2-2)×8)×512=0x1000000
文件位置=(3032+14868×2+(6-2)×8)×512=0x1004000
创建文件流程
例子
例1:在U盘中写一个文件大小小于一簇的txt(写到第6簇)
写之前:
保留扇区:
(第六簇是空的)
FAT1/2扇区(两个扇区内容完全相同):
(第六簇确实是空的)
根目录
文件簇位置
写之后
保留扇区:
磁盘重新装载,此处空余簇号并没有改变,证明其值不会自动修改!
FAT1/2扇区(两个扇区内容完全相同):
根目录
文件簇位置
txt文件
例2:在U盘中写一个文件大小大于一簇的txt(写到第7-8簇).
写之前与上方写之后相同。
写之后
保留扇区:
磁盘重新装载,此处空余簇号并没有改变,证明其值不会自动修改!
FAT1/2扇区(两个扇区内容完全相同):
根目录
文件簇位置
(第七簇)
(第八簇)
txt文件
Q&A
Q1:数据区不区分目录和数据,文件如何分辨什么地方为目录区?
Q2:目录区只分配第2簇,用完了怎么办?
A1&A2:理解系统工作顺序比较重要
系通工作顺序如下
1.通过DBR区获取根目录簇号等信息
2.计算根目录区地址
3.计算根目录区簇号在FAT表中的位置
4.如果FAT表中该簇号为结束信息,则目录索引完毕;如果不是结束信息,则FAT表指向的簇号也为目录,直到FAT表中为0x0FFFFFFF。
5.每找到一簇,读取一簇的目录
举例
1.通过DBR区获取根目录是第2簇
2.根目录地址为:0x1000000
3.根目录在FAT表中第2簇的地址为:0x17B008
4.根目录在FAT表中第2簇信息为0x00000008,找到第八簇,第八簇FAT表地址为0x17B030,数据为0x0FFFFFFF
5.目录信息在第二簇和第八簇,地址为0x1000000与0x1006000