FatFs文件系统介绍与使用

FatFs 是一个通用的文件系统(FAT/exFAT)模块,用于在小型嵌入式系统中实现FAT文件系统。

文件操作使用指南:http://elm-chan.org/fsw/ff/00index_e.html,具体如图一所示。
下载链接在上面的链接Resources的Download页面。
在这里插入图片描述

图一 FasFs文件系统API

下面对它所包含的文件进行简单的介绍(本人对于FatFs只是使用过且一知半解T-T,所以想要深入了解的朋友最好到官网进行查阅)

一、FatFs文件介绍
(一)ff.c

该文件用于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.h

该文件为ff.c的头文件,声明文件操作的函数和定义类型等。

(三)ffconf.h

该文件用于FatFs功能配置,里面有各种用于配置系统的宏定义,具体可查看http://elm-chan.org/fsw/ff/doc/config.html

(四)diskio.h

该文件为diskio.c的头文件,宏定义了不同磁盘设备和通用的指令。

(五)diskio.c

该文件为FatFs底层磁盘I/O模型框架,用于实现获取和初始化驱动、读写扇区等操作。

(六)ffunicode.c

该文件用于定义unicode编码处理函数,合理使用可以节省不必要的内存占用。

(七)ffsystem.c

该文件用于实现内存块空间的分配和释放、创建和删除同步对象、请求和释放授予访问卷的权限等操作。

(八)exfuns.c

该文件是额外可选的,用于实现遍历路径下所有的文件、获取硬盘剩余的空间和汇报文件的类型等操作。

(九)malloc.c

该文件用于分配动态内存的,在读写文件时可分配出临时空间然后将其释放,可减少内存占用,但是在实际使用中要注意内存碎片问题。

(十)cc936.c

该文件是中文编码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 ^

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
FAT是一个常见的文件系统,全称为FAT File System(FAT文件系统)。FAT 文件系统是一种在DOS 和Windows操作系统中常用的文件系统,最初是由Microsoft开发的。FATFS是基于FAT文件系统的一个轻量级的文件系统库,它是由野火团队进行开发的,用于嵌入式系统。 FATFS源码是指FATFS文件系统库的源代码。FATFS的源码可以通过互联网获得,并且是开源的。在嵌入式系统中,我们可以使用FATFS库来实现文件的读写、创建、删除等操作。使用FATFS可以使嵌入式系统能够将数据以文件的形式进行存储,并能够轻松地对文件进行管理。 FATFS源码是由C语言编写的,它提供了一些API函数用于文件系统的操作。常见的函数包括打开文件、关闭文件、读取文件数据、写入文件数据、删除文件等。通过调用这些API函数,开发者可以方便地在嵌入式系统中使用FATFS进行文件操作。 FATFS采用了FAT12、FAT16或FAT32的文件系统结构,支持长文件名、短文件名、目录结构等。它通过读取文件系统映像来初始化文件系统,并将文件系统信息保存在内存中,以便后续的文件操作。FATFS也提供了缓冲区管理等功能,以提高文件读写的效率。 总的来说,FATFS源码是一个轻量级的文件系统库,可以方便地用于嵌入式系统中。开发者可以通过研究FATFS的源码,了解文件系统的实现原理,并在自己的嵌入式系统中使用FATFS进行文件管理。这对于开发嵌入式系统中的文件存储和管理模块非常有帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值