简介
SPIFFS(Serial Peripheral Interface Flash File System)是一种专为嵌入式系统设计的轻量级文件系统,主要用于管理SPI NOR Flash存储器(如ESP8266、ESP32等微控制器上的Flash芯片)。它适用于资源有限的环境,提供基本的文件读写功能,适合存储小文件(如配置文件、网页资源等)。
本篇文章介绍如何在ESP32开发板上使用SPIFFS(SPI Flash File System)进行文件操作。看下如何初始化SPIFFS文件系统、读取文件、列出文件、删除文件,并查看存储的剩余空间。
我们使用的开发环境是Arduino IDE, 这里要注意的是,Arduino IDE 2.0及以上版本不支持官方插件,所以我们本次需要ArduinoIDE软件的版本为1.8.19。
下载插件
我们可以去这个地方下载插件:https://github.com/me-no-dev/arduino-esp32fs-plugin,安装步骤如下
选择下面的Releases
点击ESP32FS-1.1.zip下载并解压缩
找到arduino首选项安装文件夹位置,
打开该位置,在该目录下新建一个名为tools的文件夹(如果不存在)
将刚刚下载的ESP32FS-1.1.zip解压缩后的文件复制粘贴到tools目录下
重新启动arduino ide,应能看到SPIFFS上传工具插件:ESP32草图数据上传
在项目文件夹中新建一个名为data的子文件夹,并将想要上传至SPIFFS文件系统的文件放在里面,可以是音频文件、txt文本文件。这里我们先放进去一个txt文档进行SPIFFS文件系统的读取测试。其中用到的文件操作如下
SPIFSS读取文件列表
SPIFFS.begin(true)
函数功能:初始化SPIFFS文件系统
如果初始化失败,函数会返回false
SPIFFS.open("/")
函数功能:打开文件系统的根目录 (/) 并返回一个File对象,允许对该目录进行文件操作
root.openNextFile()
函数功能:用于遍历指定目录中的下一个文件。返回的File对象代表文件,允许读取文件信息
file.name()
函数功能:返回文件的名称(文件路径)
#include "SPIFFS.h"
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println("优信电子");
Serial.println("SPIFSS读取文件列表");
if (!SPIFFS.begin(true)) { Serial.println("SPIFFS加载错误!");return; }
File root = SPIFFS.open("/");
File file = root.openNextFile();
while(file)
{
Serial.print("文件: ");
Serial.println(file.name());
file = root.openNextFile();
}
}
void loop() {
}
SPIFFS读取文件内容
SPIFFS.open("/test.txt")
函数功能:用于打开路径为 /test.txt 的文件,并返回一个 File 对象。该对象允许读取文件内容。
如果文件不存在或打开失败,返回的 File 对象将无效。
file.available()
*函数功能:检查文件是否还有未读取的数据。如果文件有剩余内容,返回true,否则返回false。
file.read()
*函数功能:读取文件中的下一个字节,并返回该字节的值。每调用一次,就读取文件中的一个字节。
file.close()
*函数功能:用于关闭文件,关闭文件后不能再对文件进行任何操作。
#include "SPIFFS.h"
void setup() {
Serial.begin(115200);
SPIFFS.begin(true);
Serial.println();
Serial.println("SPIFSS读取文件内容");
File file = SPIFFS.open("/test.txt");
while(file.available())
{
Serial.write(file.read());
}
file.close();
}
void loop() {
}
SPIFFS计算空间容量
SPIFFS.totalBytes()
*函数功能:返回文件系统总的存储容量,以字节为单位。即SPIFFS文件系统的总大小。
SPIFFS.usedBytes()
*函数功能:返回当前已使用的存储容量,以字节为单位。即文件系统中存储的文件所占用的空间。
#include "SPIFFS.h"
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println("计算空间容量");
SPIFFS.begin(true);
uint32_t totalBytes = SPIFFS.totalBytes();
uint32_t usedBytes = SPIFFS.usedBytes();
// 计算剩余容量
uint32_t freeBytes = totalBytes - usedBytes;
Serial.print("总空间: ");
Serial.println(totalBytes);
Serial.print("已使用空间: ");
Serial.println(usedBytes);
Serial.print("剩余空间: ");
Serial.println(freeBytes);
}
void loop() {
}
SPIFFS删除文件
SPIFFS.remove("/test.txt")
*函数功能:用于删除指定路径的文件。返回值为true表示删除成功,false表示删除失败。
#include "SPIFFS.h"
void setup()
{
Serial.begin(115200);
SPIFFS.begin(true);
Serial.println();
Serial.println("SPIFSS删除文件列表");
File root = SPIFFS.open("/");
File file = root.openNextFile();
/*先读取文件列表*/
while(file)
{
Serial.print("文件: ");
Serial.println(file.name());
file = root.openNextFile();
}
/*删除文件列表*/
if (SPIFFS.remove("/test.txt")) {
while(1)
{
Serial.println("删除成功!");
}
} else {
Serial.println("删除失败!");
}
}
void loop() {
}
这里删除文件因为在上传前要先关闭串口,如果再打开串口复位去查看就会显示删除失败,所以这里加上一句删除成功后的循环打印。
SPIFFS清空文件
如果文件系统有很多文件,想要全部删除,不想要一个个删除,就可以用格式化文件系统函数
SPIFFS.format()
*函数功能:用于格式化 SPIFFS 文件系统。格式化操作会清空文件系统中的所有数据
#include "FS.h"
#include "SPIFFS.h"
void setup() {
Serial.begin(115200);
if (!SPIFFS.begin(true)) {
Serial.println("SPIFFS加载错误!");
return;
}
// 格式化 SPIFFS
SPIFFS.format(); // 清空文件系统
Serial.println("SPIFFS文件系统已格式化!");
}
void loop() {
}
SPIFFS基本测试
我们以读取txt文本为例,按照上面方法在工程文件夹下面,新建一个data文件夹并放入我们的测试txt文件,里面内容是hello,world!
为了方便测试我们可以将以上代码整合:
#include "SPIFFS.h"
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println("优信电子");
Serial.println("SPIFSS读取文件列表");
if (!SPIFFS.begin(true)) { Serial.println("SPIFFS加载错误!");return; }
File root = SPIFFS.open("/");
File file = root.openNextFile();
File txt = SPIFFS.open("/test.txt");
while(txt.available())
{
Serial.write(txt.read());
}
Serial.println();
txt.close();
while(file)
{
Serial.print("文件: ");
Serial.println(file.name());
file = root.openNextFile();
}
uint32_t totalBytes = SPIFFS.totalBytes();
uint32_t usedBytes = SPIFFS.usedBytes();
// 计算剩余容量
uint32_t freeBytes = totalBytes - usedBytes;
Serial.print("总空间: ");
Serial.println(totalBytes);
Serial.print("已使用空间: ");
Serial.println(usedBytes);
Serial.print("剩余空间: ");
Serial.println(freeBytes);
if (SPIFFS.remove("/f.txt")) {
Serial.println("删除成功!");
} else {
Serial.println("删除失败!");
}
}
void loop() {
}
串口信息
这里我们打开串口看到我们上传的SPIFFS文件:test.txt, 里面的内容是hello,world! 并且显示了SPIFFS相关的容量信息。
这里显示“删除失败”,是因为我们在代码里整合了之前文件操作的代码,还包括了删除SPIFFS文件,这里我只是在代码里随便删除一个不存在于SPIFFS的文件f.txt, 所以会显示“删除失败”,这里可以忽略这个信息,并不是代码有问题。
总结
本篇文章只是简单介绍了什么是SPIFSS文件系统,并对文件进行了相关操作,后面我们会驱动SPIFFS进行一个应用,感兴趣的可以先关注收藏一下。在这之前我们需要安装插件,并对SPIFFS文件系统的相关操作有一些了解。如果由于网络原因插件下载不了,可以评论区留言哦!