FAT32格式文件系统创建TXT

本人并非计算机专业,如有用词不准请谅解。按照本文步骤一步步执行即使新手也可完成简单文本文档的创建。

你需要的东西

1个格式化好的U盘(不要勾选快速格式化
1个PC
winhex.exe完全版

你最少要知道的信息

小端模式

重点内容:数据的高字节保存在内存的高地址
其余内容可自行查阅百度百科:大小端模式,或以其他渠道学习

硬盘组成

FAT32文件系统由以下四部分组成:

DBR区保留扇区FAT区数据区

以下的“只读”和“读写”是我们需要的操作,实际上磁盘的任何位置都可以读写。

DBR区

(前512个字节)——用于查找FAT1区、FAT2区、数据区开头
只读

地址长度定义我的U盘
0x0B-0x0C2每扇区字节数512
0x0D1每簇扇区数8
0x0E-0x0F2DOS保留扇区数3032
0x101FAT个数2
0x24-0x274每FAT扇区数14868
0x2C-0x2F4根目录首簇号2

保留扇区

读+写

地址(绝对地址)长度(字节)定义
0x3EC-0x3EF4下一可用空簇号

此区域用于加快索引。
可以不使用,若要使用则要注意在索引后判断是否真的是空簇(根据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-0x78文件名(E5开头则证明已经删除,20表示空)
0x8-0xA3扩展名
0xB2属性
0xC1系统保留
0xD1创建时间的10毫秒位
0xE-0xF2文件创建时间
0x10-0x112文件创建日期
0x12-0x132文件最后访问日期
0x14-0x152文件起始簇号高16位
0x16-0x172文件最近修改时间
0x18-0x192文件最近修改日期
0x1A-0x1B2文件起始簇号低16位
0x1C-0x1F4表示文件的长度

其中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表项含义举例

FAT1表
例如第二行第一组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
FAT1表
FAT2表地址=(3032+14868)×512=0x8BD800
FAT2表中第5簇首地址=3032×512+4×5=0x8BD814
FAT2表
根位置=(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

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值