版权声明:本文为博主原创文章,允许转载请注明。谢谢!                 https://blog.csdn.net/wangweijundeqq/article/details/63317673

首先,FATFS 是一个完全免费开源的 FAT 文件系统模块,专门为小型的嵌入式系统而设计的,使用标准的C语言编写,具有很强的独立性,可以轻松的移植到8位,16位,及其我正在用的32位ARM系列的STM32上面。即FATFS是可裁剪的文件系统。这点,尤为重要。

其中底层接口,包括存储媒介读/写接口(disk I/O)和供给文件创建修改时间的实时时钟,需要我们根据平台和存储介质编写移植代码。
而中间层FATFS模块,实现了FAT 文件读/写协议。FATFS模块提供的是ff.c和ff.h。除非有必要,使用者一般不用修改,使用时将头文件直接包含进去即可。
最顶层是应用层,使用者无需理会FATFS复杂的FAT 协议和内部结构,只需要调用FATFS模块提供给用户的一系列应用API接口函数。

那么,下面就来介绍下 我对FATFS文件系统的常用API接口函数的一些理解。(以下是我直接在WPS里面写好的,故直接cp过来了,往理解)

/* FRESULT f_open函数mode全部打开方式说明

---------------------------------------------------------------------------------

FA_READ           | 读模式,( 读写模式可同时生效)

FA_WRITE          | 写模式,( 读写模式可同时生效)

FA_OPEN_EXISTING  | 默认打开方式

FA_OPEN_ALWAYS   | 打开文件,如果文件不存在,则创建一个新文件;

| 用此种方式,可以用 f_lseek 在文件后追加数据

|

FA_CREATE_NEW   | 新建文件,如果文件已存在,则新建失败

FA_CREATE_ALWAYS  | 新建文件,如果文件已存在,覆盖旧文件

|

---------------------------------------------------------------------------------

*/

/*---------------------------------------------------------------------------------

/①以下测试 f_write 通过程序写入数据 即通过程序新建txt文档且有数据

res=f_open (&fil,"0:/写入.txt", FA_CREATE_ALWAYS|FA_WRITE); //新建文件和写操作

f_write (&fil, "This is a new file, the data is just written in!", 48, &bww);//前提是以写文件的形式打开文件

f_close(&fil);//关闭文件,必须和 f_open 函数成对出现,同下

res=f_open (&fil,"0:/写入.txt", FA_READ);

f_read (&fil, buf,48,&bww);

f_close(&fil);//不论打开还是新建文件啊,一定记得关闭

LCD_ShowString(10,210,280,24,24,(u8 *)buf);//

①以下测试通过程序写入数据 即通过程序新建txt文档且有数据

--------------------------------------------------------------------------------- */

/*---------------------------------------------------------------------------------

②以下测试FRESULT f_lseek()移动文件指针,此函数在对已打开的文件进行读或写时,可以移动当前指针位置 即可以加入或者减去某些不需要的数据

res=f_open (&fil,"0:/写入.txt", FA_WRITE);

res = f_lseek (&fil , 25); 指针指向第 25 个字节

res = f_write (&fil , "40" ,2 , &bw);//2为表示写入数据为2字节

// res = f_lseek (&fil , fil.fptr + 10); 指针向前移动 10 个字节

res = f_lseek (&fil , 28); 指针指向第 28个字节

res = f_write (&fil , "forward" ,8 , &bw);

// res = f_lseek (&fil , fil.fptr - 20); 指针向后移动 20 个字节

res = f_lseek (&fil , 37); 指针指向第 37 个字节

res = f_write (&fil , "backward" , 9, &bw);//写入数据为9字节

res = f_lseek (&fil , fil.fsize); 指针指向文件末尾

res = f_write (&fil , "end" ,3 , &bw);

res = f_close ( &fil );

--------------------------------------------------------------------------------- */

/*---------------------------------------------------------------------------------

③以下测试FRESULT f_truncate()截断文件,此函数可以在将文件在当前指针处截断,也可以延长文件长度

res = f_open (&fil ,"0:/写入.txt", FA_WRITE);//打开文件和写操作

res = f_lseek (&fil , 60); 指针指向第 60 个字节

res = f_truncate (&fil ); 将文件在此截断,在60字节以后的数据都会消失,即截断文件

res = f_sync ( &fil ); 关闭文件

-------------------------------------------------------------------------------- */

/*---------------------------------------------------------------------------------

④刷新缓存信息FRESULT f_sync (FIL* FileObject )函数,* FileObject==指向文件对象结构体的指针

例如:res=f_sync(&fil);

函数说明:此函数功能兼容f_close,它与f_close的区别就是在执行后,当前文件是否有效.

调用该函数后,当前文件仍然可读可写可查询.

使用方法:当文件长期处于写模式,如数据记录时,定期调用此函数,或者在写入数据后立即调用

此函数,可以减少因为断电等意外情况带来的数据损失,有点WORD中后台定期保存的意思.

--------------------------------------------------------------------------------- */

/*---------------------------------------------------------------------------------

⑤新建文件夹FRESULT f_mkdir (const TCHAR* DirName)函数,*DirName==指向将要创建的文件夹名的指针

函数说明:新建一个文件夹,

注意:文件名应符合 fatfs 标准,不能包含非法字符,

文件名长度不能大于8,否则新建不成功

例:f_mkdir("new");//新建一个文件名为new的文件夹

--------------------------------------------------------- */

/*---------------------------------------------------------------------------------

⑥删除文件和文件夹FRESULT f_unlink()函数,*FileName : 指向文件或文件夹的名称的指针

函数说明:此函数可以删除一个文件或者文件夹

使用注意项:

删除文件夹时:1.不能为当前文件夹

2.不能为非空文件夹

删除文件时: 1.不能为已打开文件

2.不能为只读文件

例如:f_unlink("new");//删除“new”这个文件夹

f_unlink("TEXT/写入.txt");//删除“TEXT”这个文件夹下的“写入”txt文本

删除文件的时候必须注意一点 此外的所有尾巴都必须是以png txt结束的

--------------------------------------------------------- */

/*---------------------------------------------------------------------------------

⑦重命名\移动文件或文件夹FRESULT f_rename (const TCHAR* OldName,const TCHAR* NewName)

函数说明:此函数可以移动或者重命名一个文件或者文件夹

参数说明:*OldName : 指向旧文件名的指针

*NewName : 指向新文件名的指针

使用注意项:

1.此函数可以重命名 文件或者文件夹,而不论文件夹是否为空.

2.此函数可以移动  文件或者文件夹,而不论文件夹是否为空.

例如:     res = f_rename("测试.txt","测试1.txt"); //重命名测试.txt文件,

res = f_rename("测试1.txt","PAINT/测试2.txt");

//将测试1.txt文件移动到文件夹PAINT中并重命名为测试2.txt

--------------------------------------------------------- */

/*---------------------------------------------------------------------------------

⑧获取文件信息 FRESULT f_stat(const TCHAR* FileName,FILINFO* FileInfo)

函数说明:此函数可以获取文件的最近修改时间,属性等信息,获取的信息存储在fileninfo结构体中

参数说明:*FileName: 指向文件名的指针

*FileInfo: 指向保存文件信息的结构体的指针 类型必须为FileInfo

使用注意项:

1.如果目标是文件夹,获取的大小为0.

2.此函数对根目录无效.

3.时间和日期均为两字节,存储格式如下:

a) 日期:

i. bit15…bit9: 年 计算后的十进制数应该加上1980

ii. bit8 … bit5: 月

iii. bit4 … bit0: 日

b) 时间:

i. bit15… bit11 : 时

ii. bit10… bit5 : 分

iii. bit4 … bit0 : 秒 算出的十进制数应 *2

举例:

i. 日期: 0000001 0001 00001, 表示 1981 年 1 月 1 日

ii.时间: 00001  000001 00001,表示 1 点 1 分 2 秒

举例:   res = f_stat("TEXT/写入.txt", &filinfo); //读取 folder 目录下 newname.txt 文件的信息

if( res )

printf("newname.txt err : %d\r\n", res);//没读取文件信息成功

else

{

printf("newname.txt size : %lu\r\n",filinfo.fsize);//读取文件的长度,即占多少字节

printf("fdate : %d\r\n",filinfo.fdate); //读取文件的最近修改日期 转化为2进制,

printf("ftime : %d\r\n",filinfo.ftime);//读取文件的最近修改时间,转化为2进制

printf("fattrib : %d\r\n",filinfo.fattrib);//显示文件的属性,即什么文件

//#define AM_RDO 0x01 //只读文件

//#define AM_HID 0x02 //隐藏文件

//#define AM_SYS 0x04 //系统文件

//#define AM_VOL 0x08 //卷标文件

//#define AM_LFN 0x0F //

//#define AM_DIR 0x10 //程序目录

//#define AM_ARC 0x20 //存档文件

//#define AM_MASK 0x3F //

}

--------------------------------------------------------- */

/*---------------------------------------------------------------------------------

⑨改变文件属性:FRESULT f_chmod (const TCHAR* FileName,BYTE Attribute,BYTE AttributeMask)

函数说明:

1. 此函数可以修改文件或文件夹的属性

2. 可修改的属性只能是以下一种或几种的组合,对其它属性无效

AM_RDO //只读文件

AM_ARC //存档文件

AM_SYS //系统文件

AM_HID //隐藏文件

参数说明:

a) *Filename:指向文件或文件夹的名称的指针

b) Attribute:要置位的属性,即需要将文件或者文件夹属性改成什么

c) AttributeMask:需要改变的属性(包括要置位的和要清除的属性),即包含原属性和需要更改的属性

使用方法:

a) Attribute 须为 AttributeMask 的子集

b) 函数对 AttributeMask 中的属性集合进行处理,若属性包含在 Attribute中,则置位,否则清除

举例: 对文件 TEXT/写入.txt,置位 HID 和 SYS 属性,取消 ARC和 RDO 属性

res = f_chmod("TEXT/写入.txt", AM_HID | AM_SYS, AM_ARC | AM_RDO | AM_HID |AM_SYS);

if( res )

printf("err :%d\r\n", res);

else

{

res = f_stat("TEXT/写入.txt", &filinfo);

printf("fattrib : %d\r\n",filinfo.fattrib);//

}

--------------------------------------------------------- */

/*---------------------------------------------------------------------------------

⑩改变文件时间戳FRESULT f_utime (TCHAR* FileName,FILINFO* TimeDate)

函数说明:

1. 此函数可以更改文件的最近修改时间

参数说明:

a) Filename :指向文件的指针

b) Timedate :指向文件信息结构体的指针

使用方法: 在这个函数里,可以我们可以写入常规的日期时间,然后此函数按日期存储格式(见上)将数据整合后调用 f_utime.

FRESULT set_timestamp ( char *obj,int year, int month, int mday, int hour, int min, int sec);//

{

FILINFO fno;

fno.fdate = (WORD)(((year - 1980) * 512U) | month * 32U | mday);

fno.ftime = (WORD)(hour * 2048U | min * 32U | sec / 2U);

return f_utime(obj, &fno);

res = set_timestamp("123.txt",2001,06,05,02,03,34);//修改 123.txt 时间

printf("%d\r\n",res);

此例没有通过,没有找到FRESULT set_timestamp();这个函数原型 

---------------------------------------------------------

fatfs应用层实例相关推荐

  1. SDIO协议梳理附SD卡读写以及FATFS移植实例

    文章列表 嵌入式各协议标准按照OSI模型的思路进行逐个梳理,文章列表如下: 串行通信&UART协议梳理附STM32平台采用DMA以UART方式收发不定长信息 I²C总线协议梳理附STM32平台 ...

  2. 文件系统应用笔记之一:FatFS在STM32F4上的移植

      在实现如U盘文件读写,SD卡的文件读写等工作时,我们往往需要一个文件系统来支持我们的工作.特别在一些MCU应用中,文件系统的加入能明显改善系统交互的友好性.在这一篇中,我们就来讨论FatFS文件系 ...

  3. Coursera: Internet History, Technology, and Security

    课程网址:https://www.coursera.org/learn/internet-history 学习笔记: Week 1: History - Dawn of Early Computing ...

  4. 架构师入门知识体系树

    在网上看到的一个架构师培训课程的知识体系树,参考下. 课程简介: 本课程针对软件团队中的架构师和专业设计人员,全面阐述架构的范围,把握方法,以及关键实践.涉及:应用架构,逻辑架构,实现架构.在课程中, ...

  5. 物联网实训室建设方案(2020完整版)

    物联网课程体系 物联网专业的人才培养目标是面向物联网产业链中"物联网解决方案供应商.系统集成商.运营及服务供应商.设备供应商.传感器设备提供商.芯片提供商",特别是商业领域的物联网 ...

  6. DRM系列(7)之drmModeAtomicCommit底层流程

    应用层实例 首先通过drmModeGetProperty()来获取property的相关信息,然后通过drmModeAtomicAddProperty()来修改property的值,最后通过drmMo ...

  7. linux显示子系统-framebuffer架构分析

    目录 简介 驱动层 时序数据流 架构 应用层 实例 fb架构优劣势 参考文件 简介 FrameBuffer,帧缓冲,简称fb,也叫显存,下文以fb代表framebuffer.该子系统是内核针对显示系统 ...

  8. 云课堂让职业院校物联网技术应用教学更简单

    职业教育是国民教育体系和人力资源开发的重要组成部分,肩负着培养多样化人才.传承技术技能.促进就业创业的重要职责.日前,"物联网技术应用"这一门与实际工作岗位联系密切且实践性较强的课 ...

  9. linux内核调试指南

    Hunnad的专栏 * 条新通知 * 登录 * 注册 * 欢迎 * 退出 * 我的博客 * 配置 * 写文章 * 文章管理 * 博客首页 * * * * 空间 * 博客 * 好友 * 相册 * 留言 ...

最新文章

  1. 织梦dedecms如何快速使用拼音首字母做栏目名称
  2. 字符串转换成utf-8编码
  3. DNS是如何工作—Vecloud微云
  4. qt4 与php 通讯,Qt与外部程序通信问题
  5. Python使用request包请求网页乱码解决方法
  6. JUnit 5和Selenium –改善项目配置
  7. 【定时同步系列2】16QAM调制+OM定时+信号分段处理+误码率曲线之MATLAB仿真(复信号模型)
  8. 数学不好的人可以学python吗_数学不好的人,适合学习深度学习,机器学习,人工智能吗?...
  9. Java基础教程:Lambda表达式
  10. printline在C语言中的作用,iswprint - [ C语言中文开发手册 ] - 在线原生手册 - php中文网...
  11. windows桌面美化
  12. 【第十届“泰迪杯”数据挖掘挑战赛】C题:疫情背景下的周边游需求图谱分析 问题一方案及Python实现
  13. JDBC :java.sql.SQLException: Access denied for user ‘root‘@‘localhost‘ (using password: YES) 数据库登录正常
  14. 执行python代码的方式_涨见识了,在终端执行 Python 代码的 6 种方式!
  15. python爬取《春风十里不如你》分析
  16. OpenAI 推出漏洞赏金计划,最高奖励 2 万美元;京东零售开启 5 年来最大组织变革;​Django 4.2|极客头条
  17. 【文本三剑客之一sed】
  18. adb 无线调试 usb拔除后立即失效解决
  19. 自考《马克思主义基本原理概论》
  20. 机械零件的强度(一)

热门文章

  1. 基于BiLSTM-Attention实现中文文本分类任务
  2. HTTP:HyperText Transfer Protocol
  3. eMMC和Nand的区别
  4. 2013年EI收录的中国期刊【转】
  5. Python的整型数据类型
  6. Unity单选题开发
  7. 【读书笔记】把时间当做朋友
  8. 当网络团购遭遇网络投诉
  9. 网上那些美女图片,为啥都爱存在CDN里面?
  10. 计算机系统 cmos电路图,CMOS集成电路版图TannerL-Edit设计入门