短文件名是DOS+FAT12/FAT16时代的产物,命名规则为8.3
8是指文件名,3是指扩展名(完整文件=文件名.扩展名)
文件名不能超过8个字节,如果多于8个字节,在DOS里不会被识别
扩展名不能超过3个字节,如果多于3个字节,在DOS里不会被识别
文件名超出8个字节或扩展名超出3个字节都是长文件名
FAT32文件系统完全支持长文件名,长文件名记录在目录项中,可能一个文件名占据多个目录项
在 FAT32文件系统中,根据结构不同可以将目录项大致分为四种:卷标目录项、 “.”目录项和“..”目录项、短文件名目录项、长文件名目录项。短文件名目录项是最重要的数据结构,其中存放着有关子目录或文件的短文件名、属性、起始簇号、时间值以及内容大小等信息。在 FAT32 文件系统中,将子目录看作是一种特殊的文件
1.如果文件名不足8个则用0x20进行填充
2.如果是子目录,则将扩展名部分用“0x20”进行填充
3.每个文件或子目录都分配有一个大小为 32 字节的短文件目录项,用以描述文件或目录的属性
4.要找到一个目录项的位置只能用分配给文件或子目录的全名进行是搜索
5.一个目录项是否被分配使用由它的第一个字节来描述。对于已经分配使用的目录项,它的第一个字节是文件名的第一个字符,而文件或目录被删除后,它所对应的目录项的第一个字节将被置为0xE5,这就是为什么有的 FAT数据恢复工具需要用户自己输入文件名的第一个字符的原因
0x0-0x7:文件名,如果该目录项正在使用中0x0位置的值为文件名或子目录名的第一个字符,如果该目录项未被使用0x0位置的值为0x00,如果该目录项曾经被使用过但是现在已经被删除则0x0位置的值为0xE5
0x8-0xA:扩展名
0xB:描述文件的属性,该字段在短文件中不可取值0x0F,如果设置为0x0F则标志是长文件
0xC:1字节,保留 (这个位默认为0,只有短文件名时才有用.当为0x00时为文件名全大写,当为0x08时为文件名全小写;0x10时扩展名全大写,0x00扩展名全小写;当为0x18时为文件名全小写,扩展名全大写)
0xD:文件创建的时间-精确到十分之一秒
0xE-0xF:文件创建的时间-时分秒,16bit 被划分为 3个部分
0~4bit 为秒,以 2秒为单位,有效值为 0~29,可以表示的时刻为 0~58
5~10bit 为分,有效值为 0~59
11~15bit 为时,有效值为 0~23
0x10-0x11:文件创建日期,16bit 也划分为三个部分
0~4bit 为日,有效值为 1~31
5~8bit 为月,有效值为 1~12
9~15bit 为年,有效值为 0~127,这是一个相对于 1980 年的年数值,也就是说该值加上 1980即为文件创建的日期值。
0x12~0x13:2 个字节,最后访问日期。
0x14~0x15:2 个字节,文件起始簇号的高两个字节。
0x16~0x17:2 个字节,文件最后修改的时间。
0x18~0x19:2 个字节,文件最后被修改时的日期。
0x1A~0x1B:文件内容起始簇号的低两个字节,与 0x14~0x15 字节处的高两个字节组成文件内容起始簇号。
0x1C~0x1F:文件内容大小字节数,只对文件有效,子目录的目录项此处全部设置为 0。
为了低版本的OS或程序能正确读取长文件名文件,系统自动为所有长文件名文件创建了一个对应的短文件名,使对应数据既可以用长文件名寻址,也可以用短文件名寻址。不支持长文件名的OS或程序会忽略它认为不合法的长文件名字段,而支持长文件名的OS或程序则会以长文件名为显式项来记录和编辑,并隐藏起短文件名。
长文件名的实现有赖于目录项偏移为0xB的属性字节,当此字节的属性为:只读、隐藏、系统、卷标,即其值为0FH时,DOS和WIN32会认为其不合法而忽略其存在。这正是长文件名存在的依据。
系统将长文件名以13个字符为单位进行切割,每一组占据一个目录项。所以可能一个文件需要多个目录项,这时长文件名的各个目录项按倒序排列在目录表中,以防与其他文件名混淆。长文件名的第一部分距离短文件名目录项是最近的。
系统在存储长文件名时,总是先按倒序填充长文件名目录项,然后紧跟其对应的短文件名。长文件名中并不存储对应文件的文件开始簇、文件大小、各种时间和日期属性。文件的这些属性还是存放在短文件名目录项中,一个长文件名总是和其相应的短文件名一一对应,短文件名没有了长文件名还可以读,但长文件名如果没有对应的短文件名,不管什么系统都将忽略其存在。所以短文件名是至关重要的。在不支持长文件名的环境中对短文件名中的文件名和扩展名字段作更改(包括删除,因为删除是对首字符改写E5H),都会使长文件名形同虚设。
当创建一个长文件名文件时,系统会自动加上对应的短文件名,其一般有的原则:
(1)、取长文件名的前6个字符加上”~1”形成短文件名,扩展名不变。
(2)、如果已存在这个文件名,则符号”~”后的数字递增,直到5。
(3)、如果文件名中”~”后面的数字达到5,则短文件名只使用长文件名的前两个字母。通过数学操纵长文件名的剩余字母生成短文件名的后四个字母,然后加后缀”~1”直到最后(如果有必要,或是其他数字以避免重复的文件名)。
(4)、如果存在老OS或程序无法读取的字符,换以”_”
长文件名中的字符采用unicode形式编码,每个字符占据2字节的空间。其目录项定义如下:
0x00~0x00:1 个字节,长文件名目录项的序列号,一个文件的第一个目录项序列号为 1,然后依次递增。如果是该文件的最后一个长文件名目录项,则将该目录项的序号与 0x40 进行“或(OR)运算”的结果写入该位置。如果该长文件名目录项对应的文件或子目录被删除,则将该字节设置成删除标志0xE5。
0x01~0x0A:10 个字节,长文件名的第 1~5 个字符。长文件名使用 Unicode 码,每个字符需要两个字节的空间。如果文件名结束但还有未使用的字节,则会在文件名后先填充两个字节的“00”,然后开始使用 0xFF 填充。
0x0B~0x0B:1 个字节,长目录项的属性标志,一定是 0x0F。
0x0C~0x0C:保留。
0x0D~0x0D:1 个字节,校验和。如果一个文件的长文件名需要几个长文件名目录项进行存储,则这些长文件名目录项具有相同的校验和。
0x0E~0x19:12 个字节,文件名的第 6~11 个字符,未使用的字节用 0xFF 填充。
0x1A~0x1B:2 个字节,保留。
0x1C~0x1F:4 个字节,文件名的第 12~13 个字符,未使用的字节用 0xFF 填充。
长文件名和短文件名之间的联系光靠他们之间的位置关系维系显然远远不够。其实,长文件名的0xD字节的校验和起很重要的作用,此校验和是用短文件名的11个字符通过一种运算方式来得到的。系统根据相应的算法来确定相应的长文件名和短文件名是否匹配
如果通过短文件名计算出来的校验和与长文件名中的0xD偏移处数据不相等。系统无论如何都不会将它们配对的。
依据长文件名和短文件名对目录项的定义,加上对簇的编号和链接,FAT32上数据的读取便游刃有余了。
“.”表示当前目录(下文中的子)
“..”表示上级目录(下文中的父)
一个子目录的起始簇,前两个目录项为“.”目录项和“..”目录项,子目录通过这两个目录项及它在父目录中的目录项建立起父子目录的联系。
“.”目录项位于子目录起始簇的第一个目录项位置,它用以表明该簇是一个子目录的起始簇。另外,该目录项实际上是对目录自身的描述,它记录了该子目录时间信息、起始簇号等。需要注意的是,它所记录的起始簇号也就是该子目录目前所处的位置。
“..”目录项位于子目录起始簇的第二个目录项位置,用于描述该子目录的父目录的相关信息。
卷标名使用11个字节描述(目录项还是32字节咯),不足 11 个字节,则用 0x20 填充。(由于每个汉字占用 2 个字节空间,而卷标最多允许 11 个字节,所以用汉字命名卷标时,卷标的长度不能超过 5 个汉字)。
卷标目录项结构与普通短文件名目录项结构完全相同,但没有创建时间和访问时间,只有一个最后修改时间。
另外,卷标目录项也没有起始簇号和大小值,这些字节位置全部这只为 0
0x0B 字节处的属性值为 0x08.
如果创建文件系统时指定了卷标,则会在根目录下第一个目录项的位置建立一个卷标目录项
卷标名最多允许占用长度为 11 个字节,也就是为短文件名分配的 11 个文件名区域
联系客服