fatfs文件系统应用程序手册中文版)
- 格式:pdf
- 大小:166.87 KB
- 文档页数:30
fatfs使用流程一、引言FAT文件系统(File Allocation Table,文件分配表)是一种常用的文件系统,广泛应用于嵌入式系统和移动存储设备中。
在使用FAT 文件系统之前,我们需要了解其使用流程,以便正确地操作和管理文件。
二、初始化FAT文件系统在开始使用FAT文件系统之前,我们需要对其进行初始化。
初始化的步骤如下:1. 创建一个FAT文件系统对象,通常命名为fs。
2. 调用初始化函数来初始化文件系统对象,例如:f_mount(&fs, "0:", 1)。
其中,第一个参数是文件系统对象,第二个参数是逻辑驱动器号,第三个参数表示是否格式化磁盘。
三、创建文件在FAT文件系统中,创建文件的步骤如下:1. 定义一个文件对象,通常命名为file。
2. 调用打开函数来创建文件,例如:f_open(&file, "test.txt", FA_CREATE_ALWAYS)。
其中,第一个参数是文件对象,第二个参数是文件名,第三个参数表示创建文件时如果文件已存在是否覆盖。
四、写入文件在FAT文件系统中,写入文件的步骤如下:1. 定义一个缓冲区用于存储待写入的数据。
2. 调用写入函数来写入数据到文件中,例如:f_write(&file, buffer, sizeof(buffer), &bytes_written)。
其中,第一个参数是文件对象,第二个参数是待写入的数据缓冲区,第三个参数是待写入的数据大小,第四个参数是实际写入的字节数。
五、读取文件在FAT文件系统中,读取文件的步骤如下:1. 定义一个缓冲区用于存储读取的数据。
2. 调用读取函数来从文件中读取数据,例如:f_read(&file, buffer, sizeof(buffer), &bytes_read)。
其中,第一个参数是文件对象,第二个参数是用于存储读取数据的缓冲区,第三个参数是待读取的数据大小,第四个参数是实际读取的字节数。
STM32笔记(六)SD卡的读写和FatFS文件系统因为要用,学习了一下SPI操作SD卡,同时移植了一个免费开源的FAT文件系统:FatFS。
感觉挺好,在单片机上实现了读写文件的操作,接下来就可以解释我的G代码咯!我的SD卡底层操作参考了网上几种常见的代码,但又对其结构做了一定的优化,至少看起来用起来比较方便。
既可以作为文件系统的diskio使用,也可以直接使用底层函数,把SD卡作为一块flash读写。
FatFs文件系统体积蛮小,6-7K足矣,对于128Kflash的STM32来说很合适,代价不大。
同时可移植性很高,最少只需要4个函数修改既可以实现文件系统的移植。
相关文件系统的介绍请看这里。
这里给一套比较完整的参考资料,包括fatfs文件系统的原版资料、几个重要的手册和网上下载的代码。
/bbs/bbs_content.jsp?bbs_sn=3210864&bbs_page_no=1&bbs_id=3020 下面是我的代码:其中底层的SPI总线对SD卡的操作在SPI_SD_driver.c/h中,而FATFS的移植文件diskio.c中对磁盘的操作函数中将调用底层的操作函数。
下面是一些底层操作函数:u8 SPI_ReadWriteByte(u8 TxData); //SPI总线读写一个字节u8 SD_WaitReady(void); //等待SD卡就绪u8 SD_SendCommand(u8 cmd, u32 arg, u8 crc); //SD卡发送一个命令u8 SD_SendCommand_NoDeassert(u8 cmd, u32 arg, u8 crc); //SD卡发送一个命令,不断线u8 SD_Init(void); //SD卡初始化u8 SD_ReceiveData(u8 *data, u16 len, u8 release); //SD卡读数据u8 SD_GetCID(u8 *cid_data); //读SD卡CIDu8 SD_GetCSD(u8 *csd_data); //读SD卡CSDu32 SD_GetCapacity(void); //取SD卡容量u8 SD_ReadSingleBlock(u32 sector, u8 *buffer); //读一个sectoru8 SD_WriteSingleBlock(u32 sector, const u8 *buffer); //写一个sectoru8 SD_ReadMultiBlock(u32 sector, u8 *buffer, u8 count); //读多个sectoru8 SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count); //写多个sector这是diskio.c中的一段代码,在disk初始化中,我们调用了SPI_SD_driver.c中的SD卡初始化函数。
FATFS文件系统剖析1:FAT16:数据按照其不同的特点和作用大致可分为5部分:MBR区、DBR区、FAT区、DIR区和DATA区,相比fat12多了DBR区Main boot record: MBR(0--1bdh)磁盘参数存放DPT(1beh--1fdh)磁盘分区表55,aa 分区结束标志DBR(Dos Boot Record)是操作系统引导记录区的意思FAT区(有两个,一个备份):对于fat16,每一个fat项16位,所以可寻址的簇项数为65535(2的16次方)。
而其每簇大小不超过32k,所以其每个分区最大容量为2G。
fat32,每一个fat项32位,可寻址簇数目为2的32次方。
DIR区(根目录区):紧接着第二FAT表(即备份的FAT表)之后,记录着根目录下每个文件(目录)的起始单元,文件的属性等。
定位文件位置时,操作系统根据DIR中的起始单元,结合FAT表就可以知道文件在硬盘中的具体位置和大小了。
DATA区:实际文件内容存放区。
FAT32:暂时放在这里,不讨论!Fatfs:嵌入式fat文件系统,支持fat16,fat32。
包含有ff.h,diskio.h,integer.h,ffconf.h 四个头文件以及ff.c 文件系统实现。
当然要实现具体的应用移植,自己要根据diskio.h实现其diskio。
c 底层驱动。
diskio.h : 底层驱动头文件ff.h : 文件系统实现头文件,定义有文件系统所需的数据结构ff.c : 文件系统的具体实现如下开始逐个文件加以分析:integer.h :仅实现数据类型重定义,增加系统的可移植性。
ffconf.h : 文件系统配置---逐个配置,先配置实现一个最小的fat文件系统,下面来分析各配置选项:#define _FFCONF 8255 //版本号#define _FS_TINY 0 /* 0:Normal or 1:Tiny */ //在这里与先前版本有些许变化,是通过配置头配置两种不同大小的文件系统,这里配置为0。
stm32 fatfs 中文编码摘要:1.简介- 介绍STM32- 介绍FATFS文件系统- 介绍中文编码2.STM32与FATFS的结合- 为什么选择FATFS文件系统- STM32如何支持FATFS- 实现过程的注意事项3.中文编码在FATFS中的处理- 中文编码的基本概念- FATFS文件系统对中文编码的支持- 中文编码在实际应用中的问题及解决方案4.总结- 回顾STM32、FATFS和中文编码的关系- 对未来发展的展望正文:1.简介STM32是一款由STMicroelectronics公司开发的基于ARM Cortex-M 内核的微控制器。
凭借其高性能、低功耗和丰富的外设资源,STM32在嵌入式领域得到了广泛应用。
为了更好地管理存储在STM32上的数据,文件系统成为了必不可少的组件。
FATFS(File Allocation Table File System)是一款经典的文件系统,适用于各种嵌入式系统。
然而,在处理中文编码文件时,STM32与FATFS的结合面临着一些挑战。
2.STM32与FATFS的结合FATFS文件系统以其简单、稳定、可移植性强等优点,成为了许多嵌入式系统的首选。
在STM32上实现FATFS,首先需要选择合适的库。
有许多开源库可供选择,如CubeMX、FatFS等。
这些库为开发者提供了丰富的例程和详细的文档,大大简化了开发过程。
在实际应用中,还需注意处理FATFS的初始化、挂载、卸载等操作,以确保文件系统的稳定运行。
3.中文编码在FATFS中的处理中文编码是指将中文字符映射为二进制序列的技术。
在FATFS中处理中文编码文件,需要确保文件系统能够正确识别并存储中文字符。
FATFS文件系统本身支持多种编码,如ASCII、UTF-8等。
为了在STM32上正确处理中文编码文件,开发者需在代码层面进行相应的处理。
例如,在写入文件时,需将中文字符转换为UTF-8编码,以确保文件系统能够正确识别。
一、读文件流程。
1、程序结构res = f_mount(0, &fs);res = f_open(&file, "data.txt", FA_OPEN_EXISTING | FA_READ);while(1){ if(fgets(data, sizeof(data), &file)==NULL){ break; }prints(data);}f_close(&file);总共四个与文件系统相关的函数,下面就沿着函数执行路径去探索一下。
2、f_mount(0, &fs)的执行参数0是卷号,就像电脑上的CDE盘等。
fs是一个未初始化的一个文件系统对象,其定义在此:FATFS fs。
这个函数好像就做了两个个事,使全局文件系统指针FatFS指向fs对象,并使fs.fstype=0。
3、f_open(&file, "data.txt", FA_OPEN_EXISTING | FA_READ)的执行参数&file是提供一个文件对象指针,打开文件过程中获得的一些信息都填入这个结构体。
FA_OPEN_EXISTING | FA_READ表示要打开和读取相应的文件。
源程序如下:FRESULT f_open (FIL *fp, /* fp就指向传入的对象file */const char *path, /*path指向data.txt的地址*/BYTE mode /* Access mode and file open mode flags */){DIR dj; 目录对象BYTE *dir; 目录项指针char fn[8+3+1]; 8.3文件名。
// 程序开头定义了这么三个变量,007c版本中由于支持长文件名,最好一个改为NAMEBUF(sfn, lfn)。
fp->fs = NULL; 每个文件对象都指向具体的文件系统,这里先清0auto_mount(&path, &dj.fs, (BYTE)(mode) ); //这个函数看来很关键了。
fatfs使用例程FATFS是一个用于嵌入式系统的开源文件系统模块,它提供了对FAT文件系统的支持。
下面是一个使用FATFS的简单例程:c.#include "ff.h"#include "diskio.h"FATFS fs; // 文件系统对象。
FIL file; // 文件对象。
FRESULT res; // 操作结果。
int main(void) {。
// 初始化文件系统。
res = f_mount(&fs, "", 1);if (res != FR_OK) {。
// 文件系统挂载失败。
while (1);}。
// 打开文件。
res = f_open(&file, "test.txt", FA_READ); if (res != FR_OK) {。
// 文件打开失败。
while (1);}。
// 读取文件内容。
char buffer[100];UINT bytesRead;res = f_read(&file, buffer, sizeof(buffer), &bytesRead);if (res != FR_OK) {。
// 文件读取失败。
while (1);}。
// 关闭文件。
f_close(&file);// 卸载文件系统。
f_mount(NULL, "", 0);while (1);}。
上述例程中,我们首先需要包含`ff.h`和`diskio.h`头文件,这些文件是FATFS库的必要文件。
然后我们定义了一个`FATFS`类型的文件系统对象`fs`,以及一个`FIL`类型的文件对象`file`,以及一个`FRESULT`类型的变量`res`用于存储操作的结果。
在`main`函数中,我们首先通过调用`f_mount`函数来挂载文件系统。
第一个参数是文件系统对象,第二个参数是逻辑驱动器号,这里使用空字符串表示默认驱动器。
FatFS⽂件系统的使⽤技术和移植⽅法总结 最近想探索⼀下⽂件系统-FATFS相关的⼀些知识,于是乎收集了相关资料,将其总结在下。
⼀、介绍⼀下FATFS FatFs是⼀个通⽤的⽂件系统(FAT/exFAT)模块,⽤于在⼩型嵌⼊式系统中实现FAT⽂件系统。
其特点如下: (1)DOS/Windows兼容的FAT/exFAT⽂件系统 (2)平台独⽴性,容易使⽤ (3)程序代码量少,占⽤资源低 (4)配置参数丰富,配置详情可参考官⽅⽹站⼆、组件包内容 ⽂件系统在嵌⼊式软件开发中的运⽤: 应⽤可以使⽤FatFs提供的API函数来进⾏⽂件系统功能的实现,使⽤FatFs提供的底层设备接⼝对存储设备进⾏适配,才能正常使⽤FatFs⽂件系统。
三、组件包分析 资源架构: 图⽚展⽰了FatFs⽂件系统的资源架构。
可见其资源⽂件较少。
FatFs提供的API函数: 使⽤这些函数接⼝来进⾏⽂件系统功能的实现,包括⽂件和⽬录的操作等。
FatFs底层存储介质接⼝函数: 这⼏个函数在在项⽬开发中,往往需要⾃⼰提供代码,来适配不同的存储媒介环境。
四,移植和使⽤⽅法总结 下⾯是关于FatFS⽂件系统移植需要的⼏个关键⽂件: ff.c(不改动) ⽂件系统的实现源代码,主要包含FatFs⽂件系统源码,移植的时候不需要修改 diskio.h(不改动) 声明diskio.c中需要的⼀些接⼝函数和命令格式 diskio.c(需要⾃写)这个⽂件是⽂件系统底层和SD驱动的中间接⼝的实现代码。
在移植FatFs的时候需要完成在diskio.h中声明的那⼏个函数。
函数在ff.c中被调⽤ integer.h(可以微改)⽂件中包含了FatFs⽤到的数据类型定义,根据移植的平台修改即可。
主要关注CPU相关的配置。
ff.h(不改动)是FatFs的⽂件系统的函数(在ff.c中)声明,以及⼀些选项的配置。
具体选项及详细说明可参见⽂件中注释。
ffconf.h(按需要) 这个是在FatFs的0.08a版本中有看到,0.06版本中还没有,是关于FatFs系统模块的⼀些配置,具体可以参考注释来进⾏配置。
[STM32]stm32+sdio+fatfs文件系统源码分析一、概述1、目的在移植之前,先将源代码大概的阅读一遍,主要是了解文件系统的结构、各个函数的功能和接口、与移植相关的代码等等。
2、准备工作在官方网站下载了0.07c版本的源代码,利用记事本进行阅读。
二、源代码的结构1、源代码组成源代码压缩包解压后,共两个文件夹,doc是说明,src里就是代码。
src文件夹里共五个文件和一个文件夹。
文件夹是option,还有00readme.txt、diskio.c、diskio.h、ff.c、ff.h、integer.h。
对比网上的文章,版本已经不同了,已经没有所谓的tff.c和tff.h了,估计现在都采用条件编译解决这个问题了,当然文件更少,可能编译选项可能越复杂。
2、00readme.txt的说明Low level disk I/O module is not included in this archive because the FatFsmodule is only a generic file system layer and not depend on any specificstorage device. Y ou have to provide a low level disk I/O module that writtento control your storage device.主要是说不包含底层IO代码,这是个通用文件系统可以在各种介质上使用。
我们移植时针对具体存储设备提供底层代码。
接下来做了版权声明-可以自由使用和传播。
然后对版本的变迁做了说明。
3、源代码阅读次序先读integer.h,了解所用的数据类型,然后是ff.h,了解文件系统所用的数据结构和各种函数声明,然后是diskio.h,了解与介质相关的数据结构和操作函数。
再把ff.c和diskio.c两个文件所实现的函数大致扫描一遍。
fatfs使用例程-回复如何使用fatfs 来读写文件。
第一步:了解FAT 文件系统FAT(File Allocation Table)是一种常见的文件系统类型,被广泛用于各种嵌入式设备和存储介质上。
FAT 文件系统有多个版本,包括FAT12、FAT16 和FAT32,其主要特点是简单、轻量级和易于实现。
FAT 文件系统使用一个文件分配表来管理磁盘空间的分配情况。
每个文件都有一个或多个簇(cluster)来存储其数据,而文件分配表则记录了每个簇的使用情况。
通过跟踪每个簇的使用状态,FAT 文件系统可以有效地管理磁盘空间,并允许文件的动态增长。
第二步:准备开发环境在开始使用fatfs 之前,我们首先需要准备好相应的开发环境。
你可以选择使用嵌入式开发板或者模拟器来进行开发,只要能够运行嵌入式操作系统即可(如FreeRTOS、ThreadX 等)。
另外,你还需要下载fatfs 的源代码,并将其添加到你的项目中。
fatfs 的源代码是一个单一的C 文件,几乎不需要任何外部依赖。
你只需要包含这个文件即可开始使用fatfs。
第三步:定义工作区和文件对象在使用fatfs 之前,你需要定义一个工作区和一个文件对象。
工作区是一个用来存储fatfs 内部数据结构的内存区域,而文件对象则用来表示一个打开的文件。
cFATFS fs;FIL file;第四步:初始化fatfs在开始使用fatfs 之前,你需要初始化fatfs 库,这可以通过调用`f_mount` 函数来完成。
在初始化之前,你可以为函数提供一个参数来指定要使用的驱动器号,或者使用默认的驱动器号(0)。
cf_mount(&fs, "", 0);第五步:打开文件在文件系统中,打开文件是一个常见的操作。
要打开一个文件,你需要使用`f_open` 函数,并指定文件对象、文件名和打开模式。
cf_open(&file, "example.txt", FA_READ);第六步:读取文件一旦文件打开成功,你就可以使用`f_read` 函数来读取文件的内容。
fatfs 详解【原创实用版】目录1.FATFS 简介2.FATFS 的特点3.FATFS 的应用领域4.FATFS 的优势与不足5.结论正文1.FATFS 简介FATFS(File Allocation Table File System)是一种适用于嵌入式系统的文件系统,由 Keil 公司开发。
FATFS 是一种可扩展的、可恢复的、易于使用的文件系统,适用于管理存储设备上的文件和数据。
它支持FAT12、FAT16 和 FAT32 三种文件分配表格式,因此可以适应不同存储容量的设备。
2.FATFS 的特点(1)可扩展性:FATFS 支持多种文件分配表格式,可以根据存储设备的容量进行选择,最大支持 2TB 的存储空间。
(2)可恢复性:FATFS 具有自动纠错功能,能够在读取数据时检测到错误并尝试修复。
同时,它还提供了一种称为“垃圾回收”的机制,用于回收已删除文件的存储空间。
(3)易于使用:FATFS 提供了丰富的应用程序编程接口(API),方便开发人员在嵌入式系统中进行文件操作。
3.FATFS 的应用领域FATFS 广泛应用于各种嵌入式系统,如智能家居、工业控制、消费电子等。
在这些领域,FATFS 可以提供可靠的文件存储和管理功能,满足设备对文件系统的需求。
4.FATFS 的优势与不足(1)优势:FATFS 具有较好的可扩展性和可恢复性,能够适应不同存储容量的设备。
同时,它提供了丰富的 API,便于开发人员进行文件操作。
(2)不足:尽管 FATFS 在嵌入式领域应用广泛,但它在某些方面存在局限性。
例如,与 extFS、yaffs 等其他文件系统相比,FATFS 在存储性能和空间利用率方面表现较差。
此外,FATFS 主要针对小容量存储设备,对于大容量存储设备而言,管理效率较低。
5.结论FATFS 是一种适用于嵌入式系统的文件系统,具有可扩展性、可恢复性和易于使用等特点。
在多种应用领域中,FATFS 都能提供可靠的文件存储和管理功能。
FATFS-------基于R0.009A 版本 函数名描述 f_mount注册/ 注销一个工作区 f_open打开/ 创建一个文件 f_close关闭一个文件 f_read读取文件 f_write写文件 f_lseek移动读/ 写指针,扩展文件大小 f_truncate截断文件大小 f_sync清空缓冲数据 f_opendir打开一个目录 f_readdir读取一个目录项 f_getfree获取空闲簇 f_stat获取文件状态 f_mkdir创建一个目录 f_unlink删除一个文件或目录 f_chmod修改属性 f_utime修改日间戳 f_rename删除/ 移动一个文件或目录 f_chdir修改当前目录 f_chdrive修改当前驱动器 f_getcwd恢复当前目录 f_forward直接输出文件数据流 f_mkfs在驱动器上创建一个文件系统 f_fdisk划分一个物理驱动器 f_gets读取一个字符串 f_putc写一个字符 f_puts写一个字符串 f_printf写一个格式化的字符串 f_tell获取当前读/ 写指针 f_eof测试一个文件是否到达文件末尾 f_size获取一个文件的大小 f_error 测试一个文件是否出错文件系统应用程序技术手册(中文版)FATFS文件系统应用程序目录:一.应用程序1. f_mount在FatFs模块上注册/ 注销一个工作区(文件系统对象)。
FRESULT f_mount (BYTE Drive, /* 逻辑驱动器号 */FATFS* FileSystemObject /* 工作区指针 */);参数Drive注册/ 注销工作区的逻辑驱动器号(0-9)。
FileSystemObject工作区(文件系统对象)指针。
返回值FR_OK (0) 函数成功。
FR_INVALID_DRIVE 驱动器号无效描述f_mount 函数在 FatFs模块上注册/ 注销一个工作区。
在使用任何其他文件函数之前,必须使用该函数为每个卷注册一个工作区。
要注销一个工作区,只要指定FileSystemObject为NULL 即可,然后该工作区可以被丢弃。
该函数只初始化给定的工作区,以及将该工作区的地址注册到内部表中,不访问磁盘I/O 层。
卷安装过程是在f_mount 函数执行后或存储介质改变后的第一次文件访问时完成的。
2. f_open创建/ 打开一个用于访问文件的文件对象FRESULT f_open (FIL* FileObject, /* 空白文件对象结构指针 */const XCHAR* FileName, /* 文件名指针 */BYTE ModeFlags /* 模式标志 */);参数FileObject将被创建的文件对象结构的指针。
FileName NULL结尾的字符串指针,该字符串指定了将被创建或打开的文件名。
ModeFlags指定文件的访问类型和打开方法。
由以下标志的一个组合指定的。
模式描述FA_READ 指定读访问对象。
可以从文件中读取数据。
与FA_WRITE 结合可以进行读写访问。
FA_WRITE 指定写访问对象。
可以向文件中写入数据。
与FA_READ 结合可以进行读写访问。
FA_OPEN_EXISTING 打开文件。
如果文件不存在,则打开失败。
(默认)FA_OPEN_ALWAYS 如果文件存在,则打开;否则,创建一个新文件。
FA_CREATE_NEW 创建一个新文件。
如果文件已存在,则创建失败。
FA_CREATE_ALWAYS 创建一个新文件。
如果文件已存在,则它将被截断并覆盖。
注意:当 _FS_READONLY == 1 时,模式标志 FA_WRITE, FA_CREATE_ALWAYS, FA_CREATE_NEW, FA_OPEN_ALWAYS 是无效的。
返回值FR_OK (0) 函数成功,该文件对象有效。
FR_NO_FILE 找不到该文件。
FR_NO_PATH 找不到该路径。
FR_INVALID_NAME 文件名无效。
FR_INVALID_DRIVE 驱动器号无效。
FR_EXIST 该文件已存在。
FR_DENIED 由于下列原因,所需的访问被拒绝:•以写模式打开一个只读文件。
•由于存在一个同名的只读文件或目录,而导致文件无法被创建。
•由于目录表或磁盘已满,而导致文件无法被创建。
FR_NOT_READY 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
FR_WRITE_PROTECTED 在存储介质被写保护的情况下,以写模式打开或创建文件对象。
FR_DISK_ERR 由于底层磁盘 I/O 接口函数中的一个错误,而导致该函数失败。
FR_INT_ERR 由于一个错误的 FAT 结构或一个内部错误,而导致该函数执行失败。
FR_NOT_ENABLED 逻辑驱动器没有工作区。
FR_NO_FILESYSTEM 磁盘上没有有效地FAT 卷。
描述如果函数成功,则创建一个文件对象。
该文件对象被后续的读/ 写函数用来访问文件。
如果想要关闭一个打开的文件对象,则使用f_close 函数。
如果不关闭修改后的文件,那么文件可能会崩溃。
在使用任何文件函数之前,必须使用 f_mount 函数为驱动器注册一个工作区。
只有这样,其他文件函数才能正常工作。
示例(文件拷贝)void main (void){FATFS fs[2]; /* 逻辑驱动器的工作区(文件系统对象) */FIL fsrc, fdst; /* 文件对象 */BYTE buffer[4096]; /* 文件拷贝缓冲区 */FRESULT res; /* FatFs 函数公共结果代码 */UINT br, bw; /* 文件读/写字节计数 *//* 为逻辑驱动器注册工作区 */f_mount(0, &fs[0]);f_mount(1, &fs[1]);/* 打开驱动器 1 上的源文件 */res = f_open(&fsrc, "1:srcfile.dat", FA_OPEN_EXISTING | FA_READ);if (res) die(res);/* 在驱动器 0 上创建目标文件 */res = f_open(&fdst, "0:dstfile.dat", FA_CREATE_ALWAYS | FA_WRITE);if (res) die(res);/* 拷贝源文件到目标文件 */for (;;) {res = f_read(&fsrc, buffe r, sizeof(buffer), &br);if (res || br == 0) break; /* 文件结束错误 */res = f_write(&fdst, buffer, br, &bw);if (res || bw < br) break; /* 磁盘满错误 */}/* 关闭打开的文件 */f_close(&fsrc);f_close(&fdst);/* 注销工作区(在废弃前) */f_mount(0, NULL);f_mount(1, NULL);}3. f_close关闭一个打开的文件FRESULT f_close (FIL* FileObject /* 文件对象结构的指针 */);参数FileObject指向将被关闭的已打开的文件对象结构的指针。
返回值FR_OK (0) 文件对象已被成功关闭。
FR_DISK_ERR 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
FR_INT_ERR 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
FR_NOT_READY 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
FR_INVALID_OBJECT 文件对象无效。
描述f_close 函数关闭一个打开的文件对象。
无论向文件写入任何数据,文件的缓存信息都将被写回到磁盘。
该函数执行成功后,文件对象不再有效,并且可以被丢弃。
如果文件对象是在只读模式下打开的,不需要使用该函数,也能被丢弃。
4. f_read从一个文件读取数据FRESULT f_read (FIL* FileObject, /* 文件对象结构的指针 */void* Buffer, /* 存储读取数据的缓冲区的指针 */UINT ByteToRead, /* 要读取的字节数 */UINT* ByteRead /* 返回已读取字节数变量的指针 */);参数FileObject指向将被读取的已打开的文件对象结构的指针。
Buffer 指向存储读取数据的缓冲区的指针。
ByteToRead 要读取的字节数,UINT范围内。
ByteRead 指向返回已读取字节数的 UINT 变量的指针。
在调用该函数后,无论结果如何,数值都是有效的。
返回值FR_OK (0) 函数执行成功。
FR_DENIED 由于文件是以非读模式打开的,而导致该函数被拒绝。
FR_DISK_ERR 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
FR_INT_ERR 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
FR_NOT_READY 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
FR_INVALID_OBJECT 文件对象无效。
描述文件对象中的读/ 写指针以已读取字节数增加。
该函数执行成功后,应该检查 *ByteRead 来检测文件是否结束,如果 *ByteRead < ByteToRead ,则表示读/写指针到达了文件结束位置。
5. f_write写入数据到一个文件FRESULT f_write (FIL* FileObject, /* 文件对象结构的指针 */const void* Buffer, /* 存储写入数据的缓冲区的指针 */UINT ByteToWrite, /* 要写入的字节数 */UINT* ByteWritten /* 返回已写入字节数变量的指针 */);参数FileObject指向将被写入的已打开的文件对象结构的指针。
Buffer 指向存储写入数据的缓冲区的指针。
ByteToRead 要写入的字节数,UINT范围内。
ByteRead 指向返回已写入字节数的 UINT 变量的指针。
在调用该函数后,无论结果如何,数值都是有效的。
返回值FR_OK (0) 函数执行成功。
FR_DENIED 由于文件是以非写模式打开的,而导致该函数被拒绝。
FR_DISK_ERR 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
FR_INT_ERR 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。