FatFs 是一个通用的文件系统(FAT/exFAT)模块,用于在小型嵌入式系统中实现FAT文件系统。
文件操作使用指南:http://elm-chan.org/fsw/ff/00index_e.html,具体如图一所示。
下载链接在上面的链接Resources的Download页面。
下面对它所包含的文件进行简单的介绍(本人对于FatFs只是使用过且一知半解T-T,所以想要深入了解的朋友最好到官网进行查阅)
该文件用于FatFs模型各种的函数定义。
字符串函数mem_cpy、mem_set、mem_cmp、chk_chr、dbc_1st等。
文件锁定函数chk_lock、enq_lock、inc_lock等。
文件或文件夹的打开、关闭、创建、移动、删除、复制、读写等操作函数。
驱动的挂载和卸载函数f_mount等。
具体可查看http://elm-chan.org/fsw/ff/doc/open.html
该文件为ff.c的头文件,声明文件操作的函数和定义类型等。
该文件用于FatFs功能配置,里面有各种用于配置系统的宏定义,具体可查看http://elm-chan.org/fsw/ff/doc/config.html
该文件为diskio.c的头文件,宏定义了不同磁盘设备和通用的指令。
该文件为FatFs底层磁盘I/O模型框架,用于实现获取和初始化驱动、读写扇区等操作。
该文件用于定义unicode编码处理函数,合理使用可以节省不必要的内存占用。
该文件用于实现内存块空间的分配和释放、创建和删除同步对象、请求和释放授予访问卷的权限等操作。
该文件是额外可选的,用于实现遍历路径下所有的文件、获取硬盘剩余的空间和汇报文件的类型等操作。
该文件用于分配动态内存的,在读写文件时可分配出临时空间然后将其释放,可减少内存占用,但是在实际使用中要注意内存碎片问题。
该文件是中文编码Simplified Chinese GBK,在实际中可以读写中文字符,但是占用的内存会很大,所以要根据实际情况使用。
如图一所示,该文件系统可实现多种文件操作,如f_open、f_close、f_read、f_write、f_lseek等。如果要使用但是不会用,可以查阅改文章开头的链接,里面有详细的使用指南和示例,例如要使用f_open,首先会有函数原型:
FRESULT f_open (
FIL* fp, /* [OUT] Pointer to the file object structure */
const TCHAR* path, /* [IN] File name */
BYTE mode /* [IN] Mode flags */
);
然后会有每个参数的说明:
fp:Pointer to the blank file object structure.(指向空白文件对象结构的指针)
path:Pointer to the null-terminated string that specifies the file name to open or create.(指向以null结尾的字符串的指针,该字符串指定要打开或创建的文件名。)
mode:Mode flags that specifies the type of access and open method for the file. It is specified by a combination of following flags.(模式标志,指定文件的访问类型和打开方法。它由以下标志的组合指定。)该参数具体选择如表一。
模式标志 | 意义 |
---|---|
FA_READ | 指定对对象的读访问,数据可以从文件中读取 |
FA_WRITE | 指定对对象的写访问,数据可以写入文件。可结合FA_READ进行读写访问。(FA_READ | FA_READ) |
FA_OPEN_EXISTING | 打开该文件。如果文件不存在,该函数将失败。(默认) |
FA_CREATE_NEW | 创建一个新文件。如果文件存在,则该函数使用FR_EXIST将失败。 |
FA_CREATE_ALWAYS | 创建一个新文件。如果文件存在,它将被截断并覆盖。 |
FA_OPEN_ALWAYS | 如果文件存在,则打开该文件。如果没有,将创建一个新文件并打开。 |
FA_OPEN_APPEND | 与FA_OPEN_ALWAYS相同,只是读/写指针设置在文件的末尾。 |
返回的类型FRESULT为一个枚举,具体如下:
typedef enum {
FR_OK = 0, /* (0) Succeeded */
FR_DISK_ERR, /* (1) A hard error occured in the low level disk I/O layer */
FR_INT_ERR, /* (2) Assertion failed */
FR_NOT_READY, /* (3) The physical drive cannot work */
FR_NO_FILE, /* (4) Could not find the file */
FR_NO_PATH, /* (5) Could not find the path */
FR_INVALID_NAME, /* (6) The path name format is invalid */
FR_DENIED, /* (7) Acces denied due to prohibited access or directory full */
FR_EXIST, /* (8) Acces denied due to prohibited access */
FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */
FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */
FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */
FR_NOT_ENABLED, /* (12) The volume has no work area */
FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */
FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any parameter error */
FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */
FR_LOCKED, /* (16) The operation is rejected according to the file shareing policy */
FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */
FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > _FS_SHARE */
FR_INVALID_PARAMETER /* (19) Given parameter is invalid */
} FRESULT;
下面给出一个我实际使用的读写数据函数:
void Read_Data(char *filename)//栈大小限制了这个函数,可以通过 限制每次读取的字节数 分次读取 来使用这个函数
{
char *buffer; //临时存储数据
char path[30] ="0:/" ;
strcat(path,filename); printf("path: %s\r\n",path);
res = f_open(fp, path, FA_OPEN_EXISTING | FA_READ); //打开文件
if(res != FR_OK) //如果打开文件错误就返回错误
{
printf("open file error : %d\r\n",res);
}
file_size = f_size(fp); //获取文件大小
printf("file size: %d",file_size);
buffer=(char *)mymalloc(SRAMIN,file_size*sizeof(char)); //申请内存
mymemset(buffer, 0, file_size*sizeof(buffer));
res = f_read(fp, buffer, file_size, &br); //读取文件
if(res != FR_OK) //如果打开文件错误就返回错误
{
printf("read file error : %d\r\n",res);
}
printf("read data num : %d\r\n",br);
printf("%s\r\n",buffer);
f_close(fp); //关闭文件
myfree(SRAMIN,buffer); //释放内存
buffer = NULL; //防止指针指向非法区域
}
void Write_Data(char *data,char *filenpath)
{
int data_length = strlen(data);//数据长度
char path[30] ="" ;
strcat(path,filenpath);
printf("path: %s\r\n",path);
printf("data_length: %d", data_length);
res = f_open(fp, path, FA_OPEN_ALWAYS | FA_WRITE | FA_READ);
if(res != FR_OK)
{
printf("open file error : %d\r\n",res);
}
else
{
res = f_lseek(fp,f_size(fp));
res = f_write(fp, data, data_length, &bw); //写数据到文件
if(res == FR_OK)
{
printf("write data ok! %d\r\n",bw);
}
else
{
printf("write data error : %d\r\n",res);
}
f_close(fp); //关闭文件
}
}
FatFs的介绍就到这里了,我也是最近做毕设需要才用这个,所以说的会很浅显,见谅。^ v ^