簡介
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文件系統的相關操作有一些了解。如果由于網絡原因插件下載不了,可以評論區留言哦!
-
嵌入式
+關注
關注
5198文章
20442瀏覽量
333986 -
FlaSh
+關注
關注
10文章
1748瀏覽量
155513 -
存儲器
+關注
關注
39文章
7738瀏覽量
171653 -
ESP32
+關注
關注
26文章
1194瀏覽量
21677
發布評論請先 登錄
esp32s3 spiffs讀取文件錯誤的原因?
ESP32C3 SPIFFS始終mount失敗的原因?
ESP32-WROVER-B spiffs初始化失敗,報錯ESP_ERR_INVALID_ARG怎么解決?
SPIFFS是什么?有何作用
esp32s3 spiffs讀取文件錯誤的原因?
ESP32C3 SPIFFS始終mount失敗的原因?
如何通過esp_http_client從ESP32 SPIFFS上傳文件到URL?
esp32s3 spiffs讀取文件錯誤的原因?
【FireBeetle 2 ESP32-S3開發板體驗】在Arduino中充分利用FireBeetle 2 ESP32-S3的16MB Flash做SPIFFS
淺談Zephyr ESP32 wifi如何使用
簡析esp32的wifi驅動如何被集成進Zephyr的驅動
如果在Zephyr內如何使用ESP32藍牙
ESP32 PWM驅動電機
ESP32驅動SPIFFS進行文件操作
評論