长文件名的规则

FAT32的一个重要的特点是完全支持长文件名。长文件名依然是记录在目录项中的。为了低版本的OS或程序能正确读取长文件名文件,系统自动为所有长文件名文件创建了一个对应的短文件名,使对应数据既可以用长文件名寻址,也可以用短文件名寻址。不支持长文件名的OS或程序会忽略它认为不合法的长文件名字段,而支持长文件名的OS或程序则会以长文件名为显式项来记录和编辑,并隐藏起短文件名。
    当创建一个长文件名文件时,系统会自动加上对应的短文件名,其一般有的原则:
    (1)、取长文件名的前6个字符加上"~1"形成短文件名,扩展名不变。
    (2)、如果已存在这个文件名,则符号"~"后的数字递增,直到5。
    (3)、如果文件名中"~"后面的数字达到5,则短文件名只使用长文件名的前两个字母。通过数学操纵长文件名的剩余字母生成短文件名的后四个字母,然后加后缀"~1"直到最后(如果有必要,或是其他数字以避免重复的文件名)。
    (4)、如果存在老OS或程序无法读取的字符,换以"_"

    长文件名的实现有赖于目录项偏移为0xB的属性字节,当此字节的属性为:只读、隐藏、系统、卷标,即其值为0FH时,DOS和WIN32会认为其不合法而忽略其存在。这正是长文件名存在的依据。将目录项的0xB置为0F,其他就任由系统定义了,Windows9x或Windows 2000、XP通常支持不超过255个字符的长文件名。系统将长文件名以13个字符为单位进行切割,每一组占据一个目录项。所以可能一个文件需要多个目录项,这时长文件名的各个目录项按倒序排列在目录表中,以防与其他文件名混淆。
    长文件名中的字符采用unicode形式编码(一个巨大的进步哦),每个字符占据2字节的空间。其目录项定义如表15。

表15   FAT32长文件目录项32个字节的表示定义
字节偏移
(16进制)
字节数定义
0x01属性字节位意义7保留未用
61表示长文件最后一个目录项
5保留未用
4顺序号数值
3
2
1
0
0x1~0xA10长文件名unicode码①
0xB1长文件名目录项标志,取值0FH
0xC1系统保留
0xD1校验值(根据短文件名计算得出)
0xE~0x1912长文件名unicode码②
0x1A~0x1B2文件起始簇号(目前常置0)
0x1C~0x1F4长文件名unicode码③

[返回索引]
   系统在存储长文件名时,总是先按倒序填充长文件名目录项,然后紧跟其对应的短文件名。从表15可以看出,长文件名中并不存储对应文件的文件开始簇、文件大小、各种时间和日期属性。文件的这些属性还是存放在短文件名目录项中,一个长文件名总是和其相应的短文件名一一对应,短文件名没有了长文件名还可以读,但长文件名如果没有对应的短文件名,不管什么系统都将忽略其存在。所以短文件名是至关重要的。在不支持长文件名的环境中对短文件名中的文件名和扩展名字段作更改(包括删除,因为删除是对首字符改写E5H),都会使长文件名形同虚设。长文件名和短文件名之间的联系光靠他们之间的位置关系维系显然远远不够。其实,长文件名的0xD字节的校验和起很重要的作用,此校验和是用短文件名的11个字符通过一种运算方式来得到的。系统根据相应的算法来确定相应的长文件名和短文件名是否匹配。这个算法不太容易用公式说明,我们用一段c程序来加以说明。
    假设文件名11个字符组成字符串shortname[],校验和用chknum表示。得到过程如下:

    int i,j,chknum=0;
    for (i=11; i>0; i--)
        chksum = ((chksum & 1) ? 0x80 : 0) + (chksum >> 1) + shortname[j++];

    如果通过短文件名计算出来的校验和与长文件名中的0xD偏移处数据不相等。系统无论如何都不会将它们配对的。
    依据长文件名和短文件名对目录项的定义,加上对簇的编号和链接,FAT32上数据的读取便游刃有余了。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FATFS是一个用于嵌入式系统的FAT文件系统模块,用于对存储设备上的文件进行管理。在FAT文件系统中,默认使用的是"8.3"命名规则,即文件名最多为8个字符,扩展名最多为3个字符。然而,FATFS也提供了对文件名的支持。 要使用文件名,首先需要在FATFS的配置文件中进行相应的设置。具体的配置方式可以参考FATFS的官方文档或开发者手册。 配置好后,在使用FATFS的API进行文件操作时,可以使用支持文件名的函数来创建、读取和写入文件。这些函数会自动处理文件名和短文件名之间的映射关系,使得开发者可以方便地操作文件名。 例如,使用FATFS提供的f_open函数来打开一个文件时,可以传入一个以NULL结尾的字符串参数,该参数即为要打开的文件名。如果文件名文件名,则FATFS会自动将其转换为相应的短文件名。类似地,对于其他文件操作函数,也可以按照相应的方式进行操作。 需要注意的是,文件名在FAT文件系统中存储的方式与短文件名有所不同,通常需要占用更多的存储空间。因此,在使用FATFS的时候,需要根据实际情况综合考虑,选择适合的文件名命名方式。 总的来说,使用FATFS支持文件名的方法是在配置文件中进行相应的设置,然后使用提供的API函数进行文件操作即可。通过这种方式,可以在嵌入式系统中方便地使用文件名来管理文件

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值