FAT文件系统 长文件名目录项
如果一个文件的文件名超过8个字符,则文件系统不但会分配短文件名,也会分配长文件名。
长文件名的格式
长文件和短文件名一样,也以32个字节为单位进行分配。不过一个单位的长文件名可以存储13个字符,且格式为unicode,即为26个字节。一个长文件名不足以保存所有的文件名(包括扩展名),则继续分配下一个长文件名,直到可以完全容纳所有的文件名(包括扩展名)。
长文件名和短文件名其中的一个区别就是长文件名不再区分文件名和扩展名,而是将文件名和扩展名合并作为一体对待。
长文件名的32个字节数所结构:
偏移 | 字节数 | 说明 |
---|---|---|
0x00~0x00: | 1 个字节, | 长文件名目录项的序列号 |
0x01~0x0A: | 10 个字节, | 长文件名的第 1~5 个字符。 |
0x0B~0x0B: | 1 个字节, | 长目录项的属性标志,一定是 0x0F。 |
0x0C~0x0C: | 1 个字节 | 保留。 |
0x0D~0x0D: | 1 个字节, | 校验和。 |
0x0E~0x19: | 12 个字节, | 文件名的第 6~11 个字符 |
0x1A~0x1B: | 2 个字节, | 保留。 |
0x1C~0x1F: | 4 个字节, | 文件名的第 12~13 个字符 |
- 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 填充。
长文件名示例
例如我们在磁盘下创建一个名为:“abcdefghijklmnopqrstuvwxyz0123456789.txt”的文件。其文件名目录项的值为:
我们可以看到,长文件名目录是按逆序的方式进行存储的。
- 最后一项(地址为:0x004000C0)为一短文件名。文件名为:“ABCDEF-1.TXT”,即这个文件的短文件名;
有时我们在一些不支持长文件的操作系统下有进可以看到此类的文件名。
倒数第二项(地址为:0x004000A0),
其第一个字节为1,代表长文件名的序号为1;
后面为unicode的”abcde”,即长文件名为1-5文件名;
接着后面为0F,代表的是长目录项标志;
接着00为保留,
27为校验和
接着后面为unicode的”fghijk”,即长文件名为6-11文件名
接着2个00为保留
最后四个字节为unicode的”lm”,即长文件名为12-13文件名。倒数第三项(地址为:0x00400080),
其第一个字节为2,代表长文件名的序号为2;
后面为unicode的”nopqr”,即长文件名为14-18文件名;
接着后面为0F,代表的是长目录项标志;
接着00为保留,
27为校验和
接着后面为unicode的”stuvwx”,即长文件名为19-24文件名
接着2个00为保留
最后四个字节为unicode的”yz”,即长文件名为25-26文件名。倒数第4项(地址为:0x00400060),
其第一个字节为3,代表长文件名的序号为3;
后面为unicode的”01234”,即长文件名为27-31文件名;
接着后面为0F,代表的是长目录项标志;
接着00为保留,
27为校验和
接着后面为unicode的”56789.”,即长文件名为32-37文件名
接着2个00为保留
最后四个字节为unicode的”tx”,即长文件名为28-39文件名。最后一项(地址为:0x00400040)
第一个字节为0x44 = 0x40 | 0x04,0x40代表有长文件名的结束,0x04代表长文件名的第4项。
后面为unicode的”t”,即长文件名扩展名的最后一件文件名字母,后面还有未用的2个UNICODE分别填充00代表结束,FF表示未用。
接着00为保留,
27为校验和
接着后面为unicode,未用,用0xFF填充
接着2个00为保留
最后四个字节为unicode,未用,用0xFF填充