ESP8266 NodeMCU 闪存文件系统(SPIFFS) 作用在ESP8266网页搭建时C语言的表达方式让代码显得冗余并且不能表达丰富的页面,因此会考虑将web网页信息放到闪存文件系统里进行请求与访问。
- ESP8266闪存文件系统基本操作 通常来说内存为4MB
- 每一个ESP8266都配有一个闪存,这个闪存很像是一个小硬盘,我们上传的文件就被存放在这个闪存里。这个闪存的全称是Serial Peripheral Interface Flash File System(SPIFFS)。
- 除了可以存放上传的程序以外,我们还可以将网页文件或者系统配置文件存放在ESP8266的闪存中。在这节课里,我们将学习如何利用程序对闪存文件系统(SPIFFS)进行文件读取和修改。
- 详解:
- 闪存文件系统 基本操作:向闪存文件写入信息 需要调用 #include<FS.h>
- 代码讲解
/*函数说明: SPIFFS.open(file_name, "w"); 以上函数有两个参数: 第一个参数是被操作的文件名称,本示例中该文件为/notes.txt 第二个参数"w" 代表写入文件信息。(如需了解如何读取信息,请参阅示例程序esp8266-flash-read) ***********************************************************************/ #include <FS.h> String file_name = "/taichi-maker/notes.txt"; //被读取的文件位置和名称 void setup() { Serial.begin(9600); Serial.println(""); Serial.println("SPIFFS format start"); SPIFFS.format(); // 格式化SPIFFS Serial.println("SPIFFS format finish"); if(SPIFFS.begin()){ // 启动SPIFFS Serial.println("SPIFFS Started."); } else { Serial.println("SPIFFS Failed to Start."); } File dataFile = SPIFFS.open(file_name, "w");// 建立File对象用于向SPIFFS中的file对象(即/notes.txt)写入信息 dataFile.println("Hello IOT World."); // 向dataFile写入字符串信息 dataFile.close(); // 完成文件写入后关闭文件 Serial.println("Finished Writing data to SPIFFS"); } void loop() { }
-
- 启动文件系统 不管是读 写 改都需要先启动闪存文件系统;通过if判断是否启动成功或者失败。
- 重点: 对文件系统进行写入操作,open函数进行"W"(写入标识符),写入到已经限定好的文件目录下面 然后文件的具体内容为dataFile.println();函数进行写入内容,写入之后进行关闭;同时在写入之前进行文件对象进行创建操作 File dataFile 进行对象创建
- 针对开发版对文件系统进行限定 通过此设置就可以选择使用了多大的闪存文件系统 要注意的是一般代码不要超过1mb
- 代码讲解
- 通过程序从闪存文件系统读取信息 通过标识符"r"进行闪存文件系统的读取 和写入函数一样第一个参数为文件目录 第二参数为标识符 首先通过if判断文件系统内部是否有内容 再者read 函数读取时只能一个字符一个字符的读取出来所以用了一个for循环进行输出 见图三读取成功
- 通过程序向闪存文件系统文件添加信息
- 代码详解 其实关键字符还是调用open函数进行限定之后写入"a"内容 然后利用2.0进行读取操作 图二成功写入 添加操作详解就是添加不会覆盖原来的内容,而是在原有的基础上进行插入
- 读出所有内容
- 代码详解 其实关键字符还是调用open函数进行限定之后写入"a"内容 然后利用2.0进行读取操作 图二成功写入 添加操作详解就是添加不会覆盖原来的内容,而是在原有的基础上进行插入
- 对文件夹进行操作 通过程序读取目录内容 上面是对一个固定文件里的操作 现在是对文件夹进行操作
- 代码详解:简单理解就是在文件对象基础上多了一个Dir 目录对象用于存储文件夹的目录因为我们知道文件的存储是有一个文件名数组就相当于有一个指针 如果找到了文件目录指针就会返回真
- 本程序第23行建立了一个字符串变量。该变量用于存储文件夹名。其中/代表根目录。 /taichi-maker/代表根目录下的taichi-maker目录。 SPIFFS.openDir(folder_name)中的openDir函数函将返回一个“目录”对象并且赋值给dir。此”目录”对象正是folder_name所存储的/taichi-maker/目录。后续程序对dir的所有操作都是针对/taichi-maker/所执行的 while循环语句的循环条件是dir.next()的返回值。dir.next()函数用于检查dir文件夹内的文件。我们可以想象dir文件夹里有一个指针,每一次调用next函数都会让指针向下挪动一格。每一次挪动一格,如果下一个位置有文件,则返回真。否则将会返回假。因此,while (dir.next())循环语句中的内容会依次显示dir文件夹中的每一个文件的文件名。
- 文件目录查找逻辑 dir.next()有文件时返回1 就会继续向下执行 一直到没有文件时返回0 退出循环
- 对文件夹进行 增删改查
- 从闪存文件系统中删除文件
- 关键函数 通过使用SPIFFS.remove(file_name)将file_name所指代的文件进行了删除操作。另外,SPIFFS.remove(file_name)的返回值为布尔型。如果文件删除执行成功则返回真,否则返回假。
- 该代码 String file_name = "/taichi-maker/notes.txt"; //被读取的文件位置和名称 删除了名为这个的文件 但是我们看见显示删除失败 原因分析 当代码上传运行时已将删除过一次了 但是按下复位按键后此时文件已经不存在了
- 关键函数 通过使用SPIFFS.remove(file_name)将file_name所指代的文件进行了删除操作。另外,SPIFFS.remove(file_name)的返回值为布尔型。如果文件删除执行成功则返回真,否则返回假。
- 显示闪存文件系统信息 文件夹
- 代码详解
- 语句FSInfo fs_info;建立了FSInfo 对象,用于存储闪存状态信息。
- 以上程序第26行语句SPIFFS.info(fs_info);。通过info函数将闪存状态信息赋给fs_info。后续的程序中,通过一系列语句将闪存状态信息通过串口监视器输出。具体信息内容可参考程序注释部分。 这部分就是通过串口显示闪存文件的具体情况。
- 从闪存文件系统中删除文件