开发环境:
1、安装ESP8266的开发环境,如Arduino IDE。
2、下载并安装ESP8266的相关开发库和工具。
我们使用的是Arduino IDE。
基本介绍:
每一个ESP8266都配有一个闪存,这个闪存很像是一个小硬盘,我们上传的文件就被存放在这个闪存里。这个闪存的全称是Serial Peripheral Interface Flash File System(SPIFFS)。除了可以存放上传的程序以外,我们还可以将网页文件或者系统配置文件存放在ESP8266的闪存中。
通过程序向闪存文件系统写入信息:
#include <FS.h>
String file_name = "/chenjiajun/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 World."); // 向dataFile写入字符串信息
dataFile.close(); // 完成文件写入后关闭文件
Serial.println("Finished Writing data to SPIFFS");
}
void loop() {
}
代码解析:
1、这里的串口函数是为了打印一些信息,可以说明程序跑到哪里和目前的状态。
2、我们首先要调用SPIFFS.format()来格式化SPIFFS。
3、之后建立File对象用于向SPIFFS中的file对象,这里的'W',表明要写。
4、之后调用建立好的对象,直接可以写入信息,存放到闪存文件系统里面。
5、在使用SPIFFS存储文件以前,我们必须使用#include "FS.h"。
6、之后dataFile.close(); 关闭这个文件。
通过程序从闪存文件系统读取信息:
#include <FS.h>
String file_name = "/chenjiajun/notes.txt"; //被读取的文件位置和名称
void setup() {
Serial.begin(9600);
Serial.println("");
if(SPIFFS.begin()){ // 启动闪存文件系统
Serial.println("SPIFFS Started.");
} else {
Serial.println("SPIFFS Failed to Start.");
}
//确认闪存中是否有file_name文件
if (SPIFFS.exists(file_name)){
Serial.print(file_name);
Serial.println(" FOUND.");
} else {
Serial.print(file_name);
Serial.print(" NOT FOUND.");
}
//建立File对象用于从SPIFFS中读取文件
File dataFile = SPIFFS.open(file_name, "r");
//读取文件内容并且通过串口监视器输出文件信息
for(int i=0; i<dataFile.size(); i++){
Serial.print((char)dataFile.read());
}
//完成文件读取后关闭文件
dataFile.close();
}
void loop() {
}
SPIFFS.exists(file_name)
用于检查闪存文件系统中有file_name文件(注:file_name变量具体信息在本程序第23行)。该函数返回值为布尔型。如果文件存在则返回真,否则将返回假。
File dataFile = SPIFFS.open(file_name, "r");
这条语句中,open函数可用于对SPIFFS进行操作。该函数共有两个参数。第一个参数file_name
是被操作的文件名称,本示例中该文件为/chenjiajun/notes.txt
第二个参数"r"
代表此操作为读取文件信息。
循环条件使用了函数dataFile.size()
。该函数将会返回dataFile的大小。循环语句体中,dataFile.read()
将会读取dataFile文件内容。每调用一次该函数都会返回dataFile文件中一个字符。再次调用,将会返回下一个字符。以此类推,直到dataFile结尾。通过for循环语句,程序将会依次读取dataFile文件内容,并且将文件内容逐字符输出于串口监视器中。
通过程序向闪存文件系统文件添加信息:
#include <FS.h>
String file_name = "/chenjiajun/notes.txt"; //被读取的文件位置和名称
void setup() {
Serial.begin(9600);
Serial.println("");
if(SPIFFS.begin()){ // 启动闪存文件系统
Serial.println("SPIFFS Started.");
} else {
Serial.println("SPIFFS Failed to Start.");
}
//确认闪存中是否有file_name文件
if (SPIFFS.exists(file_name)){
Serial.print(file_name);
Serial.println(" FOUND.");
File dataFile = SPIFFS.open(file_name, "a");// 建立File对象用于向SPIFFS中的file对象(即/notes.txt)写入信息
dataFile.println("This is Appended Info."); // 向dataFile添加字符串信息
dataFile.close(); // 完成文件操作后关闭文件
Serial.println("Finished Appending data to SPIFFS");
} else {
Serial.print(file_name);
Serial.print(" NOT FOUND.");
}
}
void loop() {
}
File dataFile = SPIFFS.open(file_name, "a");
这条语句中,open函数可用于对SPIFFS进行操作。该函数共有两个参数。第一个参数file_name
是被操作的文件名称,第二个参数"a"
代表向该文件添加信息。请留意,此处的添加信息是不会删除文件内原有信息,而是在原有信息后面添加新的信息。这与但写入操作是有所区别的。写入操作是将文件内容完全清除,重新写入新信息。
程序的第41行,dataFile.println("This is Appended Info.")
,此语句作用将会向dataFile文件尾部添加双引号中的信息内容,也就是在文件尾部添加“This is Appended Info.”。
通过程序读取目录内容:
#include <FS.h>
String file_name = "/chenjiajun/myFile.txt"; //被读取的文件位置和名称
String folder_name = "/chenjiajun"; //被读取的文件夹
void setup() {
Serial.begin(9600);
Serial.println("");
if(SPIFFS.begin()){ // 启动闪存文件系统
Serial.println("SPIFFS Started.");
} else {
Serial.println("SPIFFS Failed to Start.");
}
File dataFile = SPIFFS.open(file_name, "w");// 建立File对象用于向SPIFFS中的file对象(即myFile.txt)写入信息
dataFile.println("Hello chenjiajun."); // 向dataFile写入字符串信息
dataFile.close(); // 完成文件写入后关闭文件
Serial.println(F("Finished Writing data to SPIFFS"));
// 显示目录中文件内容以及文件大小
Dir dir = SPIFFS.openDir(folder_name); // 建立“目录”对象
while (dir.next()) { // dir.next()用于检查目录中是否还有“下一个文件”
Serial.println(dir.fileName()); // 输出文件名
}
}
void loop() {
}
建立了一个字符串变量。该变量用于存储文件夹名。其中/
代表根目录。/tchenjiajun/
代表根目录下的chenjiajun目录。
本程序第41行SPIFFS.openDir(folder_name)
中的openDir函数函将返回一个“目录”对象并且赋值给dir。此”目录”对象正是folder_name所存储的/chenjiajun/
目录。后续程序对dir的所有操作都是针对/chenjiajun/
所执行的。
本程序第43行while循环语句的循环条件是dir.next()
的返回值。dir.next()
函数用于检查dir文件夹内的文件。我们可以想象dir文件夹里有一个指针,每一次调用next函数都会让指针向下挪动一格。每一次挪动一格,如果下一个位置有文件,则返回真。否则将会返回假。因此,while (dir.next())
循环语句中的内容会依次显示dir文件夹中的每一个文件的文件名。
从闪存文件系统中删除文件:
#include <FS.h>
String file_name = "/chenjiajun/notes.txt"; //被读取的文件位置和名称
void setup() {
Serial.begin(9600);
Serial.println("");
if(SPIFFS.begin()){ // 启动闪存文件系统
Serial.println("SPIFFS Started.");
} else {
Serial.println("SPIFFS Failed to Start.");
}
//从闪存中删除file_name文件
if (SPIFFS.remove(file_name)){
Serial.print(file_name);
Serial.println(" remove sucess");
} else {
Serial.print(file_name);
Serial.println(" remove fail");
}
}
void loop() {
}
通过使用SPIFFS.remove(file_name)
将file_name
所指代的文件进行了删除操作。另外,SPIFFS.remove(file_name)
的返回值为布尔型。如果文件删除执行成功则返回真,否则返回假
显示闪存文件系统信息:
#include <FS.h>
FSInfo fs_info;
void setup() {
Serial.begin(9600);
SPIFFS.begin(); //启动SPIFFS
Serial.println("");
Serial.println("SPIFFS Started.");
// 闪存文件系统信息
SPIFFS.info(fs_info);
// 可用空间总和(单位:字节)
Serial.print("totalBytes: ");
Serial.print(fs_info.totalBytes);
Serial.println(" Bytes");
// 已用空间(单位:字节)
Serial.print("usedBytes: ");
Serial.print(fs_info.usedBytes);
Serial.println(" Bytes");
// 最大文件名字符限制(含路径和'\0')
Serial.print("maxPathLength: ");
Serial.println(fs_info.maxPathLength);
// 最多允许打开文件数量
Serial.print("maxOpenFiles: ");
Serial.println(fs_info.maxOpenFiles);
// 存储块大小
Serial.print("blockSize: ");
Serial.println(fs_info.blockSize);
// 存储页大小
Serial.print("pageSize: ");
Serial.println(fs_info.pageSize);
}
void loop() {
}
FSInfo fs_info;
建立了FSInfo 对象,用于存储闪存状态信息。SPIFFS.info(fs_info);
。通过info函数将闪存状态信息赋给fs_info。后续的程序中,通过一系列语句将闪存状态信息通过串口监视器输出。具体信息内容可参考程序注释部分。
通过Arduino IDLE向闪存文件系统上传文件: