📄 fat文件系统原理(四).htm
字号:
<TD align=middle width="18%"><FONT
size=2>已分配的簇</FONT></TD></TR>
<TR>
<TD align=middle width="16%"><FONT
size=2>FF0~FF6</FONT></TD>
<TD align=middle width="22%"><FONT
size=2>FFF0~FFF6</FONT></TD>
<TD align=middle width="27%"><FONT
size=2>FFFFFFF0~FFFFFFF6</FONT></TD>
<TD align=middle width="18%"><FONT
size=2>系统保留</FONT></TD></TR>
<TR>
<TD align=middle width="16%"><FONT size=2>FF7</FONT></TD>
<TD align=middle width="22%"><FONT size=2>FFF7</FONT></TD>
<TD align=middle width="27%"><FONT
size=2>FFFFFFF7</FONT></TD>
<TD align=middle width="18%"><FONT
size=2>坏簇</FONT></TD></TR>
<TR>
<TD align=middle width="16%"><FONT
size=2>FF8~FFF</FONT></TD>
<TD align=middle width="22%"><FONT
size=2>FFF8~FFFF</FONT></TD>
<TD align=middle width="27%"><FONT
size=2>FFFFFFF8~FFFFFFFF</FONT></TD>
<TD align=middle width="18%"><FONT
size=2>文件结束簇</FONT></TD></TR></TBODY></TABLE>
<P><BR>
FAT32的另一项重大改革是根目录的文件化,即将根目录等同于普通的文件。这样根目录便没有了FAT16中512个目录项的限制,不够用的时候增加簇链,分配空簇即可。而且,根目录的位置也不再硬性地固定了,可以存储在分区内可寻址的任意簇内,不过通常根目录是最早建立的(格式化就生成了)目录表。所以,我们看到的情况基本上都是根目录首簇占簇区顺序上的第1个簇。在图4.3.12中也是按这种情况制作的画的。<BR>
FAT32对簇的编号依然同FAT16。顺序上第1个簇仍然编号为第2簇,通常为根目录所用(这和FAT16是不同的,FAT16的根目录并不占簇区空间,32个扇区的根目录以后才是簇区第1个簇)
<BR>
FAT32的文件寻址方法与FAT16相同,但目录项的各字节参数意义却与FAT16有所不同,一方面它启用了FAT16中的目录项保留字段,同时又完全支持长文件名了。<BR>
对于短文件格式的目录项。其参数意义见表14:<BR><FONT color=#c0c0c0><SPAN
style="FONT-WEIGHT: 700; BACKGROUND-COLOR: #ffff00"></SPAN></FONT></P>
<TABLE id=table27 height=357 width=398 border=1>
<TBODY>
<TR>
<TD align=middle colSpan=4 height=15><FONT
size=2>表14
FAT32短文件目录项32个字节的表示定义</FONT></TD></TR>
<TR>
<TD align=middle width=123 height=15><FONT
size=2>字节偏移(16进制)</FONT></TD>
<TD align=middle width=86 height=15><FONT
size=2>字节数</FONT></TD>
<TD align=middle colSpan=2 height=15><FONT
size=2>定义</FONT></TD></TR>
<TR>
<TD align=middle width=123 height=15><FONT
size=2>0x0~0x7</FONT></TD>
<TD align=middle width=86 height=15><FONT
size=2>8</FONT></TD>
<TD align=middle colSpan=2 height=15><FONT
size=2>文件名</FONT></TD></TR>
<TR>
<TD align=middle width=123 height=15><FONT
size=2>0x8~0xA</FONT></TD>
<TD align=middle width=86 height=15><FONT
size=2>3</FONT></TD>
<TD align=middle colSpan=2 height=15><FONT
size=2>扩展名</FONT></TD></TR>
<TR>
<TD align=middle width=123 height=183 rowSpan=7><FONT
size=2>0xB<SUP><SPAN
style="VERTICAL-ALIGN: super">*</SPAN></SUP></FONT></TD>
<TD align=middle width=86 height=183 rowSpan=7><FONT
size=2>1</FONT></TD>
<TD align=middle width=23 height=183 rowSpan=7><FONT
size=2>属性字节</FONT></TD>
<TD align=middle width=138 height=21><FONT
size=2>00000000(读写)</FONT></TD></TR>
<TR>
<TD align=middle width=138 height=21><FONT
size=2>00000001(只读)</FONT></TD></TR>
<TR>
<TD align=middle width=138 height=21><FONT
size=2>00000010(隐藏)</FONT></TD></TR>
<TR>
<TD align=middle width=138 height=21><FONT
size=2>00000100(系统)</FONT></TD></TR>
<TR>
<TD align=middle width=138 height=27><FONT
size=2>00001000(卷标)</FONT></TD></TR>
<TR>
<TD align=middle width=138 height=21><FONT size=2>
00010000(子目录)</FONT></TD></TR>
<TR>
<TD align=middle width=138 height=21><FONT
size=2>00100000(归档)</FONT></TD></TR>
<TR>
<TD align=middle width=123 height=15><FONT
size=2>0xC</FONT></TD>
<TD align=middle width=86 height=15><FONT
size=2>1</FONT></TD>
<TD align=middle colSpan=2 height=15><FONT
size=2>系统保留</FONT></TD></TR>
<TR>
<TD align=middle width=123 height=15><FONT
size=2>0xD</FONT></TD>
<TD align=middle width=86 height=15><FONT
size=2>1</FONT></TD>
<TD align=middle colSpan=2 height=15><FONT
size=2>创建时间的10毫秒位</FONT></TD></TR>
<TR>
<TD align=middle width=123 height=15><FONT
size=2>0xE~0xF</FONT></TD>
<TD align=middle width=86 height=15><FONT
size=2>2</FONT></TD>
<TD align=middle colSpan=2 height=15><FONT
size=2>文件创建时间</FONT></TD></TR>
<TR>
<TD align=middle width=123 height=15><FONT
size=2>0x10~0x11 </FONT></TD>
<TD align=middle width=86 height=15><FONT
size=2>2</FONT></TD>
<TD align=middle colSpan=2 height=15><FONT
size=2>文件创建日期</FONT></TD></TR>
<TR>
<TD align=middle width=123 height=15><FONT
size=2>0x12~0x13</FONT></TD>
<TD align=middle width=86 height=15><FONT
size=2>2</FONT></TD>
<TD align=middle colSpan=2 height=15><FONT
size=2>文件最后访问日期</FONT></TD></TR>
<TR>
<TD align=middle width=123 height=15><FONT
style="LINE-HEIGHT: normal" size=2>0x14~0x15 </FONT></TD>
<TD align=middle width=86 height=15><FONT
size=2>2</FONT></TD>
<TD align=middle colSpan=2 height=15><FONT
style="LINE-HEIGHT: normal" size=2>文件起始簇号的高16位
</FONT></TD></TR>
<TR>
<TD align=middle width=123 height=15><FONT
size=2>0x16~0x17</FONT></TD>
<TD align=middle width=86 height=15><FONT
size=2>2</FONT></TD>
<TD align=middle colSpan=2 height=15><FONT
size=2>文件的最近修改时间</FONT></TD></TR>
<TR>
<TD align=middle width=123 height=15><FONT
size=2>0x18~0x19</FONT></TD>
<TD align=middle width=86 height=15><FONT
size=2>2</FONT></TD>
<TD align=middle colSpan=2 height=15><FONT
size=2>文件的最近修改日期</FONT></TD></TR>
<TR>
<TD align=middle width=123 height=15><FONT
size=2>0x1A~0x1B</FONT></TD>
<TD align=middle width=86 height=15><FONT
size=2>2</FONT></TD>
<TD align=middle colSpan=2 height=15><FONT
style="LINE-HEIGHT: normal"
size=2>文件起始簇号的低16位</FONT></TD></TR>
<TR>
<TD align=middle width=123 height=15><FONT
size=2>0x1C~0x1F</FONT></TD>
<TD align=middle width=86 height=15><FONT
size=2>4</FONT></TD>
<TD align=middle colSpan=2 height=15><FONT
size=2>表示文件的长度</FONT></TD></TR></TBODY></TABLE>
<TABLE id=table29 height=21 width=398 border=0>
<TBODY>
<TR>
<TD align=middle height=17>
<P align=left> *
此字段在短文件目录项中不可取值0FH,如果设值为0FH,目录段为长文件名目录段</P></TD></TR></TBODY></TABLE>
<P align=left><FONT
color=#c0c0c0></FONT>说明:<BR>
(1)、这是FAT32短文件格式目录项的意义。其中文件名、扩展名、时间、日期的算法和FAT16时相同的。<BR>
(2)、由于FAT32可寻址的簇号到了32位二进制数。所以系统在记录文件(文件夹)开始簇地址的时候也需要32位来记录,FAT32启用目录项偏移0x12~0x13来表示起始簇号的高16位。<BR>
(3)、文件长度依然用4个字节表示,这说明FAT32依然只支持小于4GB的文件(目录),超过4GB的文件(目录),系统会截断处理。</P>
<P>
FAT32的一个重要的特点是完全支持长文件名。长文件名依然是记录在目录项中的。为了低版本的OS或程序能正确读取长文件名文件,系统自动为所有长文件名文件创建了一个对应的短文件名,使对应数据既可以用长文件名寻址,也可以用短文件名寻址。不支持长文件名的OS或程序会忽略它认为不合法的长文件名字段,而支持长文件名的OS或程序则会以长文件名为显式项来记录和编辑,并隐藏起短文件名。<BR>
当创建一个长文件名文件时,系统会自动加上对应的短文件名,其一般有的原则:<BR>
(1)、取长文件名的前6个字符加上"~1"形成短文件名,扩展名不变。<BR>
(2)、如果已存在这个文件名,则符号"~"后的数字递增,直到5。<BR>
(3)、如果文件名中"~"后面的数字达到5,则短文件名只使用长文件名的前两个字母。通过数学操纵长文件名的剩余字母生成短文件名的后四个字母,然后加后缀"~1"直到最后(如果有必要,或是其他数字以避免重复的文件名)。<BR>
(4)、如果存在老OS或程序无法读取的字符,换以"_"</P>
<P>
长文件名的实现有赖于目录项偏移为0xB的属性字节,当此字节的属性为:只读、隐藏、系统、卷标,即其值为0FH时,DOS和WIN32会认为其不合法而忽略其存在。这正是长文件名存在的依据。将目录项的0xB置为0F,其他就任由系统定义了,Windows9x或Windows
2000、XP通常支持不超过255个字符的长文件名。系统将长文件名以13个字符为单位进行切割,每一组占据一个目录项。所以可能一个文件需要多个目录项,这时长文件名的各个目录项按倒序排列在目录表中,以防与其他文件名混淆。<BR>
长文件名中的字符采用unicode形式编码(一个巨大的进步哦),每个字符占据2字节的空间。其目录项定义如表15。</P>
<TABLE id=table30
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -