下冰雹 · 2020年11月02日

FatFs路径名称规则、字符集和卷管理

本文基于V0.12b版本

1.路径名称格式

FatFs模块路径名格式与DOS/Windos文件名规格类似,如下所示:

                                 [驱动器:] [/]目录/文件

FatFs模块支持长文件名(LFN)和8.3格式文件名(SFN)。当LFN特性使能(_USE_LFN>0)后,LFN才能使用。子目录使用一个'\'或'/'隔开,这和DOS/Windows的API相同。重复的分隔符会被跳过或忽略。一个不同之处是,FatFs逻辑驱动使用一个带冒号的数字表示。当遗漏驱动号,FatFs模块假设使用的是默认驱动(0或者当前驱动)。

控制字符(\0~\0x1f)被当做路径名的结尾。对于长文件名,最开始和中间的空格属于路径名的有效字符,但是对于短文件名,空格会被认为是路径名的结束。无论是长文件名还是短文件名,结尾的空格和'.'会被忽略。

默认配置下(_FS_RPATH==0,使用绝对路径)不像基于操作系统的文件系统,它没有当前目录的概念。所有卷上的对象必须使用从根目录开始的绝对路径(完整路径),不允许点目录名(“.”、“..”)。标题分隔符(Heading separator,比如“0:\”)被忽略,可以存在也可以省略。默认驱动器号为0。

当使能相对路径时(_FS_RPATH==1),如果标题分隔符存在,则指定的路径名从根目录开始;否则路径名从函数f_chdir(改变当前目录,需要_FS_RPATH=1)设置的当前目录开始。在路径名中也允许点名字。默认驱动器由函数f_chdrive指定。
image.png

当_STR_VOLUME_ID=1使能字符串卷标识时,可以在路径名中使用预先定义的字符串作为驱动器标识符,比如"sd:file1.txt"、"ram:swapfile.dat"以及类似与DOS/Windows风格的盘符。特别注意:在这个版本中双点(“..”)目录名不能在exFAT卷中表示父目录,单点目录名仍可使用。

2.合法字符集和大小写敏感性

FatFs文件系统中,文件名的合法字符集为:0-9 A-Z ! # $ % &( ) - @ ^ _ ’ { } ~和扩展字符集(\x80-\xFF)。如果使能长文件名,合法的文件名字符还有空格和+ , ; = [ ],并且空格可以放在文件名的开始和中间位置(短文件名不允许文件名中有空格)。

FatFs对卷上的对象名大小写不敏感,比如file.txt、File.Txt和FILE.TXT这三个名字对FatFs来说是相同的。这个规则同样适合扩展字符集。当在FAT卷上创建对象时,如果使用短文件名,则文件名字母被转换为大写字母;如果使用长文件名,则保持原始的文件名,不作转换。

使用双字节字符集(DBCS)的MS-DOS系统,对扩展字符集大小写是敏感的。为了符合这种风格,FatFs仅在使用双字节非长文件名时对扩展字符集大小写敏感。如果配置为使用长文件名,FatFs对所有字符集不敏感(Windows NT风格)。在Windows系统下使用扩展字符集在非长文件名、非双字节字符集配置的卷上创建一个对象时,会产生兼容性问题。因此在FAT卷上使用双字节扩展字符集的对象不应该用在其它系统中。

3.Unicode API

路径名可以为ANSI/OEM编码和Unicode编码中的一种,取决于配置选项。指定的路径名参数类型定义为TCHAR,默认情况下对应关键字char。在ANSI/OEM模式下,路径的名称字符串的编码由宏_CODE_PAGE设置。当_LFN_UNICODE设置为1时,表示使用Unicode编码。此时TCHAR定义为WCHAR,以便支持Unicode(UTF-16编码)。在这种情况下,Unicode字符,比如✟☪ ☸ ☭都可以用作路径名。

Unicode字符集会影响字符串函数的数据类型和编码方式。使用宏_T(s)和_TEXT(s)定义的字符串常量能够自动选择使用ANSI/OEM或者Unicode编码。

f_open(fp, "filename.txt",FA_READ);      /* ANSI/OEM 字符串 */
f_open(fp, L"filename.txt",FA_READ);     /* Unicode 字符串 */
f_open(fp, _T("filename.txt"),FA_READ);   /* 由配置宏选择 */
4.卷管理

每个卷(逻辑驱动器)都有必须有一个文件系统对象,它通过函数f_mount向FAT模块注册或解除注册。默认情况下一个物理驱动器上只能有一个逻辑驱动器,并且驱动号相同。比如物理驱动器0上只能有一个逻辑驱动器0。f_mount函数会读取启动扇区或分区来检查物理设备上是否是FAT文件系统,对于SFD,会检查扇区0;对于FDISK,会检查第1分区、第2分区、第3分区和第4分区。

如果宏_MULTI_PARTITION==1,表示1个物理驱动器上可以有多个逻辑驱动器,这些逻辑驱动器和分区必须预先定义在分区解析表VolToPart[]中。目前版本在同一物理驱动器上最多支持4个逻辑分区。

/* 举例:逻辑驱动器0-2绑定在三个物理驱动器0上的三个分区中
      逻辑驱动器3绑定在物理驱动器1上*/
PARTITION VolToPart[] = {
   {0, 1},     /* "0:"==> Physical drive 0, 1st partition */
   {0, 2},     /* "1:"==> Physical drive 0, 2nd partition */
   {0, 3},     /* "2:"==> Physical drive 0, 3rd partition */
   {1, 0}      /* "3:"==> Physical drive 1, auto detection */
};

image.png

作者:朱工
首发博客:https://freertos.blog.csdn.net/article/details/53315771
关注FreeRTOS从基础到高级专栏,即时收取FreeRTOS系列文章。
推荐阅读
关注数
3259
内容数
54
介绍FreeRTOS的基本功能,移植与使用。主要介绍FreeRTOS的裁剪、任务、内存管理、队列、信号量、任务通知等基本组成,看完可以会用FreeRTOS,高级篇会深入介绍FreeRTOS的实现细节、方法、技巧。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息