谈一谈FATFS文件管理系统

先了解些基本概念。。。

 

文件管理系统,是负责管理存储文件信息的软件机构。即在磁盘上自制文件的方法。

目前常用的文件系统主要有微软的FATI2、FATI6、FAT32、FAT32、NTFS以及Linux系统下的EXT2、EXT3等。目前,在消费电子产品中,用的最多的还是FAT文件系统,如U盘、MP3、数码相机等。

FATFS是一个完全免费开源的文件系统模块,专门为小型嵌入式系统而设计。它支持多个存储媒介,有独立的缓冲区,可以对多个文件进行读写。完全用标准C语言编写,所以具有很好的硬件平台独立性,是一种可裁剪的文件系统。

FATFS文件系统的特点:

  1. 支持多卷,最多10卷物理分区;
  2. 支持长文件名、Unicode;
  3. 支持RTOS;
  4. 只读、最小化的API、I/O缓冲区等。

FATFS有个简化版本Tiny-FATFS,用法几乎一样,仅仅包含不同的头文件而言,它跟完整版的区别是:

  1. 占用内存更少,只要1KB RAM;
  2. 1次仅支持1个存储介;

接下来说一下内容。。。

下载FATFS文件系统包,下载地址http://elm-chan.org/fsw/ff/00index_e.html

相关文件中,ffconf.h,  ff.h,   ff.c ,都是处于文件系统三层结构的的中间层。

diskio.h,  diskio.c 属于底层硬件层,   ff.h,   ff.c 是文件系统层和文件系统的API层,ffconf.h中包含FATFS模块的配置项。

移植步骤

  • 数据类型:在integer.h里面去定义好数据的类型
  • 配置功能:通过ffconf.h配置FATFS的相关功能
  • 函数编写:在diskio.c中进行底层驱动编写

接口函数

disk_initialize//初始化磁盘,入口参数为卷标,根据卷标的不同进行不同的初始化操作

disk_status//获得磁盘状态,直接返回,因为初始化的时候已经获取了返回值,如果返回不成功,初始化就不会通过。

disk_read //从磁盘驱动器上读取扇区

disk_write //向磁盘写入一个或多个扇区

disk_ioctl //向指定盘符按指定命令代码进行除了读写操作外的其他杂项功能

 

FATFS的API函数

一.注册工作区域 注册工作区域
FRESULT f_mount ( 
 BYTE Drive, /* Logical drive number */ 
 FATFS* FileSystemObject /* Pointer to the work area */ 
); 
函数说明:
1. 此函数的作用就是在磁盘里注册一个缓冲区域,用来存储 FAT32 文件系统的一些相关信息.
2. 参数说明:
a) Drive : 盘符
b) *FileSystemObject : 指向缓冲区域的指针
3. 对磁盘进行操作之前,这个函数是不可少的
例程 : f_mount(0 , &fs); 
二.打开文件夹 打开文件夹
FRESULT f_opendir ( 
 DIR* DirObject, /* Pointer to the blank directory object 
structure */ 
 const TCHAR* DirName /* Pointer to the directory name */ 

函数说明: 
1. 此函数可以打开一个已存在的文件夹
2. 参数说明: 
a) *DirObject : 指向一个空白的结构体,用来存储要打开的文件夹信息
b) *DirName : 指向该文件夹名称的指针

三.读取文件夹 读取文件夹
FRESULT f_readdir ( 
 DIR* DirObject, /* Pointer to the open directory object */ 
 FILINFO* FileInfo /* Pointer to the file information structure */ 
); 
函数说明: 
1. 此函数按照顺序读取文件夹内文件
2. 参数说明: 
a) *DirObject : 指向读取的文件夹的信息结构体的指针
b) *FileInfo : 指向文件信息结构体,用来存储读取到的文件的信息
3. 重复调用此函数可读取文件夹内所有文件
4. 当所有文件读取结束,函数返回一个空字符串到 f_name[] 中
5. 如果一个空指针赋给 *FileInfo ,将返回从第一个文件开始读取.

四.打开打开\\\新建一个文件 \新建一个文件:
FRESULT f_open ( 
 FIL* FileObject, /* Pointer to the blank file object structure 
*/ 
 const TCHAR* FileName, /* Pointer to the file neme */ 
 BYTE ModeFlags /* Mode flags */ 
); 
函数说明: 
1. 此函数可以打开,或新建一个文件
2. 参数说明
a) *FileObject : 指向一个用来存储文件对象的空结构体的指针
b) *FileName : 指向文件名的指针
c) ModeFlags : 打 开 方 式 , 可 以 是 以 下 一 种 或 几 种 的 组 合 ( 默 认 方 式 是FA_OPEN_EXISTING)

五.读取文件 读取文件:
FRESULT f_read ( 
 FIL* FileObject, /* Pointer to the file object structure */ 
 void* Buffer, /* Pointer to the buffer to store read data */ 
 UINT ByteToRead, /* Number of bytes to read */ 
 UINT* ByteRead /* Pointer to the variable to return number of bytes 
read */ 
); 
函数说明:
1. 这个函数可以读取文件的内容
2. 参数说明:
a) *FileObject : 指向文件对象结构体的指针
b) *Buffer : 指向存储读取到的数据的缓冲的指针
c) ByteToRead : 准备读取的字节数
d) *ByteRead : 
i. 它的作用就是用来检测文件的末尾,就是下面例程中的这一句: 
 if (res || br < sizeof(buffer)) break; 
ii. 每次 f_read 执行完后,*ByteRead 值等于本次读取到的字节数,若*ByteRead<ByteToRead,即本次读取到的字节小于准备读取的字节,说明读指针已到达文件末尾.

六.写文件 写文件:
FRESULT f_write ( 
 FIL* FileObject, /* Pointer to the file object structure */ 
 const void* Buffer, /* Pointer to the data to be written */ 
 UINT ByteToWrite, /* Number of bytes to write */ 
 UINT* ByteWritten /* Pointer to the variable to return number of 
bytes written */ 
); 
函数说明:
1. 此函数用来向文件中写入数据,前提是以写文件的方式打开文件
2. 参数说明:
a) *FileObject : 指向文件对象结构体的指针
b) *Buffer : 指向数据缓冲的指针
c) ByteToWrite : 准备写入的字节数
d) *ByteWritten : 记录已写入的字节数,用来检测是否写完
3. 后两个参数的长度都是两个字节,计数值最大为 65536,所以一次写入字节数最大为64K。一般情况下一次不会写这么长的数据,因为就算 RAM 足够用,也不会在里面开一个几十 K 的数据缓冲区。

七.刷新缓存信息 刷新缓存信息:
FRESULT f_sync ( 
 FIL* FileObject /* Pointer to the file object */ 
); 
函数说明:
1. 此函数功能兼容 f_close,它于 f_close 的区别就是执行后,当前文件是否仍然有效. 
2. 参数说明:
a) *FileObject : 指向文件对象结构体的指针
3. 调用此函数后,当前文件仍然可读可写可查询. 
4. 当文件处于长时间的写模式,如数据记录时,定期调用此函数,或在写入数据后立即调用此函数,可以减少因断电等意外情况带来的损失.有点 WORD 中后台定期保存的意思.

八. 新建文件夹
FRESULT f_mkdir ( 
 const TCHAR* DirName /* Pointer to the directory name */ 
); 
函数说明:
1. 新建一个文件夹
2. 参数说明:
a) *DirName : 指向将要创建的文件夹名的指针
3. 文件名应符合 fatfs 标准,不能包含非法字符, 
4. 若不支持长文件名,文件名长度不能大于 8,否则新建不成功
5. 例程:
a) f_mkdir("new"); 
b) f_mkdir("folder/new"); 
九.删除文件 .删除文件或文件夹:
FRESULT f_unlink ( 
 const TCHAR* FileName /* Pointer to the object name */ 
); 
函数说明:
1. 此函数可以删除一个文件或文件夹
2. 参数说明:
a) *FileName : 指向文件或文件夹的名称的指针
3. 删除文件夹时:
a) 不能为当前文件夹
b) 不能为非空文件夹
4. 删除文件时
a) 不能为已打开文件
b) 不能为只读文件

十.重命名 \ 移动文件 或文件夹
FRESULT f_rename ( 
 const TCHAR* OldName, /* Pointer to old object name */ 
 const TCHAR* NewName /* Pointer to new object name */ 
); 
函数说明:
1. 此函数可以移动或重命名一个文件或文件夹
2. 参数说明:
a) *OldName : 指向旧文件名的指针
b) *NewName : 指向新文件名的指针
3. 此函数可重命名 文件 或 文件夹 ,而不论文件夹是否为空
4. 此函数可移动 文件 或 文件夹 ,而不论文件夹是否为空

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值