logo资料库

FATFS浅谈.pdf

第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
第4页 / 共16页
第5页 / 共16页
第6页 / 共16页
第7页 / 共16页
第8页 / 共16页
资料共16页,剩余部分请下载后查看
FATFS 浅谈 刚开始看到 FATFS 时,一头雾水,不知道从何下手,网上也搜了很多 资料,要么高深莫测,要么简单地一笔代过. 断断续续地摸索了一段时间,算是对文件系统有了初步的认识,整 理一下思路,将自己的学习过程,及学习心得写出来与大家分享, 文笔 有限,力求简洁易懂,希望对初学者有所帮助,不足之处请指正. 笔者用的是酷学玩 summer V1.3 的开发板,64M 的 microSD 卡(已 格式化为 FAT32 格式),底层驱动是 yuanyin 移植的,如果你用的不是 酷学玩 stm32 的板子,那也没关系,网上有很多移植的例程,可以参照着 尝试移植;或者根据酷学玩的例程修改也可. 本文主要介绍 FATFS 的 API 函数,仅针对初学者入门,高手请拍 砖. 例程中用到的全局变量定义如下: FATFS fs; FIL fsrc, fdst; FRESULT res; // FatFs function common result code UINT br, bw; // File R/W count // Work area (file system object) for logical drive // file objects 更多资料见 酷学玩首页:http://www.q-sharewe.com
一一一一....注册工作区域 注册工作区域 注册工作区域 注册工作区域 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 ,将返回从第一个文件开始读取. 更多资料见 酷学玩首页:http://www.q-sharewe.com
例程:这段程序先打开文件夹 folde/move ,然后查找其中的存档文件,并通过串口输出 读取的文件名 if (f_opendir(&dirs, "folder/move") == FR_OK) { while (f_readdir(&dirs, &finfo) == FR_OK) { //按照顺序读文件夹 //打开文件夹 //如果文件名为 0,结束 //判断文件属性 if(!finfo.fname[0]) break; { } if(finfo.fattrib == AM_ARC) Debug("文件名:%s\r\n",finfo.fname); } 串口输出如下: } 在 PC 上查看 SD 卡: 可以看到,程序输出了后面三个文件的名称,对文件夹没作处理,因为在程序里 对文件属性进行了判断: if(finfo.fattrib == AM_ARC),意思是只对存档文件进行处理; 至于什么是存档文件,以下是在百度知道搜到的结果: 视窗系统中文件属性有四种类型,我来告诉你这四种类型是什么意思: 只读-表示该文件不能被修改 隐藏 -表示该文件在系统中是隐藏的,在默认情况下用户不能看见这些文件。 系统 - 表示该文件是操作系统的一部分。 存档- 表示该文件在上次备份前已经修改过了,一些备份软件在备份系统后会把这些文件默 认的设为存档属性。 存档属性在一般文件管理中意义不大,但是对于频繁的文件批量管理很有帮助。 更多资料见 酷学玩首页:http://www.q-sharewe.com
四四四四....打开打开打开打开\\\\新建一个文件 新建一个文件:::: 新建一个文件 新建一个文件 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) Value Value Value Value Description Description Description Description FA_READ 读模式,(读写模式可同时生效) FA_WRITE 写模式,(读写模式可同时生效) FA_OPEN_EXISTING 默认打开方式 FA_OPEN_ALWAYS 打开文件,如果文件不存在,则创建一个新文件; 用此种方式,可以用 f_lseek 在文件后追加数据 FA_CREATE_NEW 新建文件,如果文件已存在,则新建失败 FA_CREATE_ALWAYS 新建文件,如果文件已存在,覆盖旧文件 读取文件:::: 五五五五....读取文件 读取文件读取文件 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,即本次读取到的字节小于准备读取的字节,说明读指针已到达 文件末尾. 更多资料见 酷学玩首页:http://www.q-sharewe.com
res = f_open(&fsrc, "news/news.txt", FA_READ); if(!res) { } f_close(&fsrc); //不论是打开,还是新建文件,一定记得关闭 例程:此处参考酷学玩例程,以读取的方式打开文件,然后将文件内容通过串口输出。 运行后串口输出结果: Debug("%s\r\n",buffer); Debug("open news/news.txt : %d\r\n",res); br=1; a=0; Debug("文件内容:"); for (;;) { res = f_read(&fsrc, buffer, sizeof(buffer), &br); if (res || br < sizeof(buffer)) break; // error or eof } for(a=0; a<512; a++) buffer[a]=0; 下面是在PC中查看: 更多资料见 酷学玩首页:http://www.q-sharewe.com
六六六六....写文件写文件写文件写文件:::: 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 的数据缓冲区。 例程: 结合前面的 f_open 函数,在下面例程中以写的方式新建一个 txt 文档,然后写入 100 个字节。 已定义:unsighed char buffer[100] = "This is a new file, the data is just written in! 这是一个新 文件,数据也是新的!"; res = f_open(&fsrc, "new/NewText.txt", FA_WRITE | FA_CREATE_ALWAYS); if (res == FR_OK) { } f_close(&fsrc); // 关闭文件,必须和 f_open 函数成对出现 Debug("write error : %d\r\n",res); break; Debug("create file ok!\r\n"); Debug("start write!\r\n"); do { } while (bw < 100); // 判断是否写完(bw > 100,表示写入完成) res = f_write(&fsrc, buffer, 100,&bw); if(res) { } Debug("write ok!\r\n"); 更多资料见 酷学玩首页:http://www.q-sharewe.com
运行后串口输出: 下面为PC中查看结果: 掌握以上几个函数后,,,,可以可以可以可以利用利用利用利用 FATFS 对对对对SDSDSDSD卡卡卡卡进行进行进行进行基本的读写 掌握以上几个函数后 基本的读写操操操操 基本的读写 掌握以上几个函数后 掌握以上几个函数后 基本的读写 作作作作了了了了。。。。 下面介绍另外几个常用的函数。。。。 下面介绍另外几个常用的函数 下面介绍另外几个常用的函数 下面介绍另外几个常用的函数 更多资料见 酷学玩首页:http://www.q-sharewe.com
七七七七....移动文件指针 移动文件指针:::: 移动文件指针 移动文件指针 FRESULT f_lseek ( FIL* FileObject, /* Pointer to the file object structure */ DWORD Offset /* File offset in unit of byte */ ); 函数说明: 1. 此函数在对已打开的文件进行读或写时,可以移动当前指针位置 2. 参数说明: a) FileObject : 指向文件对象结构体的指针 b) Offset : 指针移动的长度 例程: 参考官网作者公布的例程,本例以前文中 new/news.txt 文件为基础 运行后在PC中查看结果:红色部分为笔者注. res = f_open (&fsrc ,"news/news.txt", FA_WRITE); res = f_lseek (&fsrc , 500); res = f_write (&fsrc , "500" ,3 , &bw); res = f_lseek (&fsrc , fsrc.fptr + 100); res = f_write (&fsrc , "forward" ,8 , &bw); res = f_lseek (&fsrc , fsrc.fptr - 200); res = f_write (&fsrc , "backward" , 9, &bw); res = f_lseek (&fsrc , fsrc.fsize); res = f_write (&fsrc , "end" ,3 , &bw); res = f_close ( &fsrc ); ////指针指向文件末尾 ////指针指向第 500 个字节 ////指针向前移动 100 个字节 ////指针向后移动 200 个字节 更多资料见 酷学玩首页:http://www.q-sharewe.com
分享到:
收藏