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

3346人阅读 评论(0) 收藏 举报
分类:

         本文基于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指定。


         当_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 */
};




查看评论

John McGowan's AVI Overview: Programming and Other Technical Topics

John McGowans AVI Overview: Programming and Other Technical Topics Windows Multimedia SystemIn Win16...
  • sonicdater
  • sonicdater
  • 2002-04-11 17:57:00
  • 1853

FatFs 使用中文长文件名

一、说明 使用长文件名,一般会是在使用 f_readdir() 这个函数时碰到,这个函数的功能就是获取上一步使用 f_opendir() 打开的文件夹中的内容,并将文件信息保存到定义的结构体。结构体...
  • u011303443
  • u011303443
  • 2017-02-24 13:41:06
  • 1193

FATFS 简单示例

前两天我的同事jacky出了一个基于mico实时操作系统的fatfs基础教程视频,这里先感谢下jacky花费大量时间的备课,将fatfs讲述的很详细,条理清晰,并且当场撸了一段代码实现了对文件的读写。...
  • yi_xiangd
  • yi_xiangd
  • 2017-01-18 17:45:40
  • 1208

FATFS一个小问题搞了我2天才解决.特此发帖,希望大家不要重蹈我的覆辙

问题:在做豪华版fatfs实验的时候,发现从综合实验移植过来的fatfs部分,f_mkdir不能正常工作,跟踪调试发现死在move_window函数里面,如下图红线处. 只要...
  • u012252959
  • u012252959
  • 2017-07-16 18:27:46
  • 1898

FatFS文件系统介绍及使用例程

FATFS是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块。FatFs 的编写遵循ANSI C,并且完全与磁盘I/O层分开。因此,它独立(不依赖)于硬件...
  • xiaoluoshan
  • xiaoluoshan
  • 2016-06-15 21:54:08
  • 6954

fatfs 学习笔记--f_mount用法

f_mount The f_mount fucntion registers/unregisters filesystem object to the FatFs module. FRESUL...
  • lbaihao
  • lbaihao
  • 2017-07-15 09:59:42
  • 3169

等级考试!!!

  • ptboy
  • ptboy
  • 2009-10-12 16:05:00
  • 178

Fatfs f_size()API用法

f_size()作用是查看文件大小,但在官方文档中没有给出应用实例。 简单测试之后发现f_size()的正确用法如下: 1.f_open() 2.f_size() 3.f_close() 若...
  • KeepSomething
  • KeepSomething
  • 2017-05-27 09:26:05
  • 1033

FatFs中文介绍和移植方法

本文很不错,故转载如下,但不是最新版的FatFS。 FatFS的官方网站  提供了详细的资料 ——————————————一下为转载—————————————————————- 下面是我做的一...
  • andylauren
  • andylauren
  • 2016-08-26 11:13:45
  • 3154

FatFs模块系统应用指南

本文使用的FatFs版本:V0.12b(2016年9月4发布)1.如何移植1.1首要考虑 FatFs模块移植基于以下假设条件:ANSI C编译器应遵循ANSI C。FatFs模块是以ANSI C(C8...
  • zhzht19861011
  • zhzht19861011
  • 2016-10-22 17:24:14
  • 4689
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 170万+
    积分: 1万+
    排名: 1161
    博客专栏
    最新评论
    友情链接