3-3-1 ESP8266闪存文件系统基本操作

位置导航: 首页 / 物联网教程 / 第3章 – 用C/C++开发物联网 / 3-3 闪存文件系统 /本页

不知道您有没有想过,当我们上传程序给ESP8266时,我们的程序具体存放在什么地方呢?

每一个ESP8266都配有一个闪存,这个闪存很像是一个小硬盘,我们上传的文件就被存放在这个闪存里。这个闪存的全称是Serial Peripheral Interface Flash File System(SPIFFS)。

除了可以存放上传的程序以外,我们还可以将网页文件或者系统配置文件存放在ESP8266的闪存中。在这节课里,我们将学习如何利用程序对闪存文件系统(SPIFFS)进行文件读取和修改。

1. 通过程序向闪存文件系统写入信息

在使用SPIFFS存储文件以前,我们必须使用#include "FS.h",如以上程序第18行所示。

程序第20行,我们建立了一个字符串变量。该变量用于存储文件位置和文件名。其中/代表根目录。/taichi-maker/代表根目录下的taichi-maker目录。notes.txt代表着文件名称。

程序第27行SPIFFS.format();是对闪存文件系统进行格式化。这很想是我们对u盘进行格式化的操作。您无需每次使用闪存文件系统都对它进行格式化操作。这里仅仅是为了演示如何使用SPIFFS.format();

程序第30行,SPIFFS.begin()用于启动闪存文件系统。在每次使用闪存文件系统以前都需要执行这一操作。如果闪存文件系统成功启动,该函数的返回值为布尔型,如果成功启动闪存文件形同,则返回真。否则将返回假。

程序第36行,File dataFile = SPIFFS.open(file_name, "w");这条语句中,open函数可用于对SPIFFS进行操作。该函数共有两个参数。第一个参数file_name是被操作的文件名称,本示例中该文件为/taichi-maker/notes.txt
第二个参数"w"代表此操作为向SPIFFS写入文件信息。请注意:如果文件系统没有/taichi-maker/notes.txt文件,此操作将会在文件系统中建立该文件。如果文件系统有该文件,则程序将会重新建立该文件,即原有文件信息将会被覆盖。

程序第37行dataFile.println("Hello IOT World.");用于向dataFile文件写入信息。信息内容为“Hello IOT World.”。

程序第38行dataFile.close();用于关闭dataFile文件。结束文件操作后,应执行此操作。

2. 通过程序从闪存文件系统读取信息

以上程序第36行,SPIFFS.exists(file_name)用于检查闪存文件系统中有file_name文件(注:file_name变量具体信息在本程序第23行)。该函数返回值为布尔型。如果文件存在则返回真,否则将返回假。

以上程序第45行,File dataFile = SPIFFS.open(file_name, "r");这条语句中,open函数可用于对SPIFFS进行操作。该函数共有两个参数。第一个参数file_name是被操作的文件名称,本示例中该文件为/taichi-maker/notes.txt
第二个参数"r"代表此操作为读取文件信息。

以上程序第48行的for循环语句中,循环条件使用了函数dataFile.size()。该函数将会返回dataFile的大小。循环语句体中,dataFile.read()将会读取dataFile文件内容。每调用一次该含税都会返回dataFile文件中一个字符。再次调用,将会返回下一个字符。以此类推,直到dataFile结尾。通过for循环语句,程序将会依次读取dataFile文件内容,并且将文件内容逐字符输出于串口监视器中。

3. 通过程序向闪存文件系统文件添加信息

在以上程序的第40行里,File dataFile = SPIFFS.open(file_name, "a");这条语句中,open函数可用于对SPIFFS进行操作。该函数共有两个参数。第一个参数file_name是被操作的文件名称,第二个参数"a"代表向该文件添加信息。请留意,此处的添加信息是不会删除文件内原有信息,而是在原有信息后面添加新的信息。这与但写入操作是有所区别的。写入操作是将文件内容完全清除,重新写入新信息。
,
程序的第41行,dataFile.println("This is Appended Info."),此语句作用将会向dataFile文件尾部添加双引号中的信息内容,也就是在文件尾部添加“This is Appended Info.”。

4. 通过程序读取目录内容

本程序第23行建立了一个字符串变量。该变量用于存储文件夹名。其中/代表根目录。/taichi-maker/代表根目录下的taichi-maker目录。

本程序第41行SPIFFS.openDir(folder_name)中的openDir函数函将返回一个“目录”对象并且赋值给dir。此”目录”对象正是folder_name所存储的/taichi-maker/目录。后续程序对dir的所有操作都是针对/taichi-maker/所执行的。

本程序第43行while循环语句的循环条件是dir.next()的返回值。dir.next()函数用于检查dir文件夹内的文件。我们可以想象dir文件夹里有一个指针,每一次调用next函数都会让指针向下挪动一格。每一次挪动一格,如果下一个位置有文件,则返回真。否则将会返回假。因此,while (dir.next())循环语句中的内容会依次显示dir文件夹中的每一个文件的文件名。

5. 从闪存文件系统中删除文件

以上程序中第25行,通过使用SPIFFS.remove(file_name)file_name所指代的文件进行了删除操作。另外,SPIFFS.remove(file_name)的返回值为布尔型。如果文件删除执行成功则返回真,否则返回假。

6. 显示闪存文件系统信息

以上程序第16行语句FSInfo fs_info;建立了FSInfo 对象,用于存储闪存状态信息。

以上程序第26行语句SPIFFS.info(fs_info);。通过info函数将闪存状态信息赋给fs_info。后续的程序中,通过一系列语句将闪存状态信息通过串口监视器输出。具体信息内容可参考程序注释部分。

以上是关于ESP8266闪存文件系统的常用功能介绍。关于ESP8266闪存文件系统的更多操作介绍,请参考Arduino ESP8266官方页面中的介绍部分。该页面可点击以下链接前往。

https://arduino-esp8266.readthedocs.io/en/latest/filesystem.html