0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ESP32驱动SPIFFS进行文件操作

jf_88434166 来源:jf_88434166 作者:jf_88434166 2025-08-05 18:11 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

简介

SPIFFS(Serial Peripheral Interface Flash File System)是一种专为嵌入式系统设计的轻量级文件系统,主要用于管理SPI NOR Flash存储器(如ESP8266ESP32微控制器上的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文件系统的相关操作有一些了解。如果由于网络原因插件下载不了,可以评论区留言哦!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5211

    文章

    20737

    浏览量

    338338
  • FlaSh
    +关注

    关注

    10

    文章

    1761

    浏览量

    156052
  • 存储器
    +关注

    关注

    39

    文章

    7768

    浏览量

    172386
  • ESP32
    +关注

    关注

    27

    文章

    1232

    浏览量

    22632
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    esp32s3 spiffs读取文件错误的原因?

    我的应用想通过uart将bin文件传到spiffs进行保存(因为进行远程升级时,esp32s3没办法直接连外网。连外网的是另一个模块),但b
    发表于 06-14 06:34

    ESP32C3 SPIFFS始终mount失败的原因?

    使用的是arduinoesp32 2.0.3 sdk 用的是esp32SPIFFS -> SPIFFS_Test例程 使用的是合宙的e
    发表于 06-17 07:07

    ESP32-WROVER-B spiffs初始化失败,报错ESP_ERR_INVALID_ARG怎么解决?

    芯片:ESP32-WROVER-B IDF版本:release/v4.3 开发环境:Windows10 各位好,我遇到spiffs初始化失败的问题,但我感觉我给的config应该没啥
    发表于 06-21 10:35

    SPIFFS是什么?有何作用

    文章目录关于SPIFF的使用——esp32学习笔记零、简述一、SPIFFS函数二、文件关于SPIFF的使用——esp32学习笔记零、简述SPIFFS
    发表于 01-11 06:18

    esp32s3 spiffs读取文件错误的原因?

    我的应用想通过uart将bin文件传到spiffs进行保存(因为进行远程升级时,esp32s3没办法直接连外网。连外网的是另一个模块),但b
    发表于 02-13 06:47

    ESP32C3 SPIFFS始终mount失败的原因?

    使用的是arduinoesp32 2.0.3 sdk用的是esp32SPIFFS -> SPIFFS_Test例程使用的是合宙的esp32
    发表于 02-14 08:15

    如何通过esp_http_client从ESP32 SPIFFS上传文件到URL?

    我在 C 中使用 ESP32S3 和 ESP-IDF。我需要使用 HTTP post 请求将存储在 SPIFFS 中的文件上传到 URL。我发现我必须为此使用
    发表于 03-02 08:15

    esp32s3 spiffs读取文件错误的原因?

    我的应用想通过uart将bin文件传到spiffs进行保存(因为进行远程升级时,esp32s3没办法直接连外网。连外网的是另一个模块),但b
    发表于 03-06 06:09

    【FireBeetle 2 ESP32-S3开发板体验】在Arduino中充分利用FireBeetle 2 ESP32-S3的16MB Flash做SPIFFS

    | 米羅科技文創學院 (mirotek.com.tw) ESP32 文件系统(LittleFS/FatFS/SPIFFS)对文件的读取写入列表删除
    发表于 08-02 09:55

    Perl编程之进行文件操作

    到现在为止,我们介绍的P e r l程序都是独立的程序。除了向用户提供消息和接收来自键盘 的输入信息外,它们无法与外界进行通信。这种状况将要改变。 P e r l是一种能够进行文件输入
    发表于 03-26 15:59 0次下载

    浅谈Zephyr ESP32 wifi如何使用

    和ethernt L2对接,因此在zephyr下只要通过简单的配置就可以在应用层使用socket通过wifi进行网络通信,而不需要去关心esp32 wifi驱动的细节。 配置方法 进行
    的头像 发表于 06-01 10:17 8838次阅读

    简析esp32的wifi驱动如何被集成进Zephyr的驱动

    分析Zephyr ESP32 WIFI驱动的实现可以更为清晰的掌握esp32 wifi在zephyr上的使用,本文主要分析esp32的wifi驱动
    的头像 发表于 06-01 10:41 5901次阅读
    简析<b class='flag-5'>esp32</b>的wifi<b class='flag-5'>驱动</b>如何被集成进Zephyr的<b class='flag-5'>驱动</b>

    ESP32驱动0.96寸彩屏

    继上次的ESP32在4寸彩屏的应用外,还有哪些规格的彩屏同样可以被ESP32驱动呢?没错,0.96寸的彩屏同样可以!
    发表于 06-07 17:14 3100次阅读

    ESP32 PWM驱动电机

    ESP32 寻迹模块测试 寻迹模块测试 所选设备 ESP32使用PWM 示例代码 寻迹模块测试 所选设备 ’ ESP32 引脚 说明 16 需要先拉低在拉高,才能驱动电机 13 PWM
    发表于 03-20 11:37 4次下载
    <b class='flag-5'>ESP32</b> PWM<b class='flag-5'>驱动</b>电机

    ESP32ESP32通过Internet进行通信

    电子发烧友网站提供《ESP32ESP32通过Internet进行通信.zip》资料免费下载
    发表于 06-15 09:58 5次下载
    <b class='flag-5'>ESP32</b>到<b class='flag-5'>ESP32</b>通过Internet<b class='flag-5'>进行</b>通信