簡(jiǎn)介
SPIFFS(Serial Peripheral Interface Flash File System)是一種專(zhuān)為嵌入式系統(tǒng)設(shè)計(jì)的輕量級(jí)文件系統(tǒng),主要用于管理SPI NOR Flash存儲(chǔ)器(如ESP8266、ESP32等微控制器上的Flash芯片)。它適用于資源有限的環(huán)境,提供基本的文件讀寫(xiě)功能,適合存儲(chǔ)小文件(如配置文件、網(wǎng)頁(yè)資源等)。
本篇文章介紹如何在ESP32開(kāi)發(fā)板上使用SPIFFS(SPI Flash File System)進(jìn)行文件操作??聪氯绾纬跏蓟疭PIFFS文件系統(tǒng)、讀取文件、列出文件、刪除文件,并查看存儲(chǔ)的剩余空間。
我們使用的開(kāi)發(fā)環(huán)境是Arduino IDE, 這里要注意的是,Arduino IDE 2.0及以上版本不支持官方插件,所以我們本次需要ArduinoIDE軟件的版本為1.8.19。

下載插件
我們可以去這個(gè)地方下載插件:https://github.com/me-no-dev/arduino-esp32fs-plugin,安裝步驟如下

選擇下面的Releases
點(diǎn)擊ESP32FS-1.1.zip下載并解壓縮
找到arduino首選項(xiàng)安裝文件夾位置,
打開(kāi)該位置,在該目錄下新建一個(gè)名為tools的文件夾(如果不存在)

將剛剛下載的ESP32FS-1.1.zip解壓縮后的文件復(fù)制粘貼到tools目錄下
重新啟動(dòng)arduino ide,應(yīng)能看到SPIFFS上傳工具插件:ESP32草圖數(shù)據(jù)上傳
在項(xiàng)目文件夾中新建一個(gè)名為data的子文件夾,并將想要上傳至SPIFFS文件系統(tǒng)的文件放在里面,可以是音頻文件、txt文本文件。這里我們先放進(jìn)去一個(gè)txt文檔進(jìn)行SPIFFS文件系統(tǒng)的讀取測(cè)試。其中用到的文件操作如下
SPIFSS讀取文件列表
SPIFFS.begin(true)函數(shù)功能:初始化SPIFFS文件系統(tǒng)
如果初始化失敗,函數(shù)會(huì)返回false
SPIFFS.open("/")函數(shù)功能:打開(kāi)文件系統(tǒng)的根目錄 (/) 并返回一個(gè)File對(duì)象,允許對(duì)該目錄進(jìn)行文件操作
root.openNextFile()函數(shù)功能:用于遍歷指定目錄中的下一個(gè)文件。返回的File對(duì)象代表文件,允許讀取文件信息
file.name()函數(shù)功能:返回文件的名稱(文件路徑)
#include "SPIFFS.h"
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println("優(yōu)信電子");
Serial.println("SPIFSS讀取文件列表");
if (!SPIFFS.begin(true)) { Serial.println("SPIFFS加載錯(cuò)誤!");return; }
File root = SPIFFS.open("/");
File file = root.openNextFile();
while(file)
{
Serial.print("文件: ");
Serial.println(file.name());
file = root.openNextFile();
}
}
void loop() {
}
SPIFFS讀取文件內(nèi)容
SPIFFS.open("/test.txt")函數(shù)功能:用于打開(kāi)路徑為 /test.txt 的文件,并返回一個(gè) File 對(duì)象。該對(duì)象允許讀取文件內(nèi)容。
如果文件不存在或打開(kāi)失敗,返回的 File 對(duì)象將無(wú)效。
file.available()*函數(shù)功能:檢查文件是否還有未讀取的數(shù)據(jù)。如果文件有剩余內(nèi)容,返回true,否則返回false。
file.read()*函數(shù)功能:讀取文件中的下一個(gè)字節(jié),并返回該字節(jié)的值。每調(diào)用一次,就讀取文件中的一個(gè)字節(jié)。
file.close()*函數(shù)功能:用于關(guān)閉文件,關(guān)閉文件后不能再對(duì)文件進(jìn)行任何操作。
#include "SPIFFS.h"
void setup() {
Serial.begin(115200);
SPIFFS.begin(true);
Serial.println();
Serial.println("SPIFSS讀取文件內(nèi)容");
File file = SPIFFS.open("/test.txt");
while(file.available())
{
Serial.write(file.read());
}
file.close();
}
void loop() {
}
SPIFFS計(jì)算空間容量
SPIFFS.totalBytes()*函數(shù)功能:返回文件系統(tǒng)總的存儲(chǔ)容量,以字節(jié)為單位。即SPIFFS文件系統(tǒng)的總大小。
SPIFFS.usedBytes()*函數(shù)功能:返回當(dāng)前已使用的存儲(chǔ)容量,以字節(jié)為單位。即文件系統(tǒng)中存儲(chǔ)的文件所占用的空間。
#include "SPIFFS.h"
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println("計(jì)算空間容量");
SPIFFS.begin(true);
uint32_t totalBytes = SPIFFS.totalBytes();
uint32_t usedBytes = SPIFFS.usedBytes();
// 計(jì)算剩余容量
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")*函數(shù)功能:用于刪除指定路徑的文件。返回值為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() {
}
這里刪除文件因?yàn)樵谏蟼髑耙汝P(guān)閉串口,如果再打開(kāi)串口復(fù)位去查看就會(huì)顯示刪除失敗,所以這里加上一句刪除成功后的循環(huán)打印。
SPIFFS清空文件
如果文件系統(tǒng)有很多文件,想要全部刪除,不想要一個(gè)個(gè)刪除,就可以用格式化文件系統(tǒng)函數(shù)
SPIFFS.format()*函數(shù)功能:用于格式化 SPIFFS 文件系統(tǒng)。格式化操作會(huì)清空文件系統(tǒng)中的所有數(shù)據(jù)
#include "FS.h"
#include "SPIFFS.h"
void setup() {
Serial.begin(115200);
if (!SPIFFS.begin(true)) {
Serial.println("SPIFFS加載錯(cuò)誤!");
return;
}
// 格式化 SPIFFS
SPIFFS.format(); // 清空文件系統(tǒng)
Serial.println("SPIFFS文件系統(tǒng)已格式化!");
}
void loop() {
}
SPIFFS基本測(cè)試
我們以讀取txt文本為例,按照上面方法在工程文件夾下面,新建一個(gè)data文件夾并放入我們的測(cè)試txt文件,里面內(nèi)容是hello,world!

為了方便測(cè)試我們可以將以上代碼整合:
#include "SPIFFS.h"
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println("優(yōu)信電子");
Serial.println("SPIFSS讀取文件列表");
if (!SPIFFS.begin(true)) { Serial.println("SPIFFS加載錯(cuò)誤!");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();
// 計(jì)算剩余容量
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() {
}
串口信息
這里我們打開(kāi)串口看到我們上傳的SPIFFS文件:test.txt, 里面的內(nèi)容是hello,world! 并且顯示了SPIFFS相關(guān)的容量信息。
這里顯示“刪除失敗”,是因?yàn)槲覀冊(cè)诖a里整合了之前文件操作的代碼,還包括了刪除SPIFFS文件,這里我只是在代碼里隨便刪除一個(gè)不存在于SPIFFS的文件f.txt, 所以會(huì)顯示“刪除失敗”,這里可以忽略這個(gè)信息,并不是代碼有問(wèn)題。
總結(jié)
本篇文章只是簡(jiǎn)單介紹了什么是SPIFSS文件系統(tǒng),并對(duì)文件進(jìn)行了相關(guān)操作,后面我們會(huì)驅(qū)動(dòng)SPIFFS進(jìn)行一個(gè)應(yīng)用,感興趣的可以先關(guān)注收藏一下。在這之前我們需要安裝插件,并對(duì)SPIFFS文件系統(tǒng)的相關(guān)操作有一些了解。如果由于網(wǎng)絡(luò)原因插件下載不了,可以評(píng)論區(qū)留言哦!
-
嵌入式
+關(guān)注
關(guān)注
5198文章
20436瀏覽量
333946 -
FlaSh
+關(guān)注
關(guān)注
10文章
1747瀏覽量
155502 -
存儲(chǔ)器
+關(guān)注
關(guān)注
39文章
7738瀏覽量
171643 -
ESP32
+關(guān)注
關(guān)注
26文章
1193瀏覽量
21659
發(fā)布評(píng)論請(qǐng)先 登錄
esp32s3 spiffs讀取文件錯(cuò)誤的原因?
ESP32C3 SPIFFS始終mount失敗的原因?
ESP32-WROVER-B spiffs初始化失敗,報(bào)錯(cuò)ESP_ERR_INVALID_ARG怎么解決?
SPIFFS是什么?有何作用
esp32s3 spiffs讀取文件錯(cuò)誤的原因?
ESP32C3 SPIFFS始終mount失敗的原因?
如何通過(guò)esp_http_client從ESP32 SPIFFS上傳文件到URL?
esp32s3 spiffs讀取文件錯(cuò)誤的原因?
【FireBeetle 2 ESP32-S3開(kāi)發(fā)板體驗(yàn)】在Arduino中充分利用FireBeetle 2 ESP32-S3的16MB Flash做SPIFFS
淺談Zephyr ESP32 wifi如何使用
簡(jiǎn)析esp32的wifi驅(qū)動(dòng)如何被集成進(jìn)Zephyr的驅(qū)動(dòng)
如果在Zephyr內(nèi)如何使用ESP32藍(lán)牙
ESP32驅(qū)動(dòng)0.96寸彩屏
ESP32 PWM驅(qū)動(dòng)電機(jī)
ESP32到ESP32通過(guò)Internet進(jìn)行通信
ESP32驅(qū)動(dòng)SPIFFS進(jìn)行文件操作
評(píng)論