# 12. 文件系统SPIFFS

### 1. 为什么要使用文件系统

在BiBoard（ESP32）中，除了常规的程序区和引导区，我们在Flash分区中使用了文件系统。

独立分区的文件系统作用如下：

* 在指定的地址保存数据而不会因为重新更新而删除（如校准数据，步态数据）
* 不用外置的SD卡，节约了硬件资源
* [保存HTML和CSS文件以建立Web服务器](https://randomnerdtutorials.com/esp32-web-server-spiffs-spi-flash-file-system/);
* [保存图像，音频等文件](https://randomnerdtutorials.com/display-images-esp32-esp8266-web-server/)；

常见的文件系统有Windows的NTFS，exFAT，Linux的日志文件系统Ext和XFS。但是在嵌入式领域，这些大型的文件系统太过庞大。我们使用了轻量级的SPIFFS（SPI Flash File System SPI闪存文件系统），用于SPI NOR flash设备的嵌入式文件系统，支持磨损均衡、文件系统一致性检查等功能。

因为轻量，SPIFFS最大的特点在于不支持树形目录，即全部文件扁平存储于同一层。ESP32提供的SPIFFS有以下特点：

* 目前，SPIFFS 尚不支持目录，但可以生成扁平结构。如果 SPIFFS 挂载在 /spiffs 下，在 /spiffs/tmp/myfile.txt 路径下创建一个文件则会在 SPIFFS 中生成一个名为 /tmp/myfile.txt 的文件，而不是在 /spiffs/tmp 下生成名为 myfile.txt 的文件；
* SPIFFS 并非实时栈，每次写操作耗时不等；
* 目前，SPIFFS 尚不支持检测或处理已损坏的块。

### 2. 安装Arduino ESP32文件系统上传器

您可以通过自己的Arduino代码创建/保存以及删除文件，但操作比较繁琐，您需要将数据甚至二进制文件放入Arduino的Sketch并通过运行程序创建文件。

然而有个很好用的工具，可以直接把文件从计算机上传至文件系统，虽然比起“可移动存储”的“拖-放”式拷贝略微麻烦一些，但是无论是MP3音频还是HTML网页文件，都可以很轻松的上传至Flash。下面我们来学习如何使用这个插件。

### 3. 安装ESP32 文件上传插件

#### 3.1 环境准备

请安装Arduino IDE（版本号：1.8.\*），并且具有Arduino IDE的ESP32支持包（参考[BiBoard V0快速上手指南](https://docs.petoi.com/chinese/biboard/li-cheng/pages/-MW8XMhYmHPWngr7tjib#3.2.1-zhun-bei-esp32-kai-fa-huan-jing)）。

#### 3.2 下载ESP32FS插件

下载ESP32FS插件的压缩包，地址：

{% embed url="<https://github.com/me-no-dev/arduino-esp32fs-plugin/releases>" %}

![下载适用于Arduino IDE的ESP32 SPIFFS文件系统fs](/files/-MX3u8f43nV4QyyzHETi)

转到“Arduino”目录，然后打开“tools”文件夹

`C:\Users\{YourUserName}\Documents\Arduino\tools`

将下载&#x7684;*.zip*文件夹解压缩到 “tools” 文件夹。您应该具有以下类似的文件目录结构：

C:\Users\\`{YourUserName}`\Documents\Arduino\tools\ESP32FS\tool\esp32fs.jar

最后，重新启动Arduino IDE。

要检查插件是否已成功安装，请打开Arduino IDE。选择开发板（ESP32 Dev Module），转到“工具”，然后检查是否具有“ ESP32 Sketch Data Upload ”选项。

<figure><img src="/files/d9Yholkp4sh5VoNM8y4V" alt=""><figcaption></figcaption></figure>

### 4. 使用文件系统上传器上传文件

要将文件上传到ESP32文件系统，请按照以下步骤：

* 创建一个Arduino项目工程（比如：名称 Test.ino）并保存
* 打开该工程的目录，可以使用“项目-显示项目文件夹”选项

<figure><img src="/files/qMdKqUbaxK7XPfPG8Vek" alt=""><figcaption></figcaption></figure>

* 在该文件夹内，创建一个名为“data”的新文件夹。

![](/files/-MX3u8f9AePOYGCR7f4O)

* 在“data” 文件夹中，放入您要保存到SPIFFS文件系统中的文件。例如，创建一个*test\_example.txt*文件，内容如下图所示：

![](/files/-MX3u8fA-be4lWnaeJlG)

* 在Arduino IDE中，点击 “工具”  - “ESP32 Sketch Data Upload”&#x20;

<figure><img src="/files/XSg0xManblE8yv2hh8Nk" alt=""><figcaption></figcaption></figure>

当您看到“ SPIFFS Image Uploaded ”提示信息时，文件已成功上传到SPIFFS文件系统中。

![](/files/-MX3u8fCs_JnT93T_S81)

### 5. 文件系统使用例程

文件系统的例程SPIFFS\_Test.ino（`C:\Users\{YourUserName}\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.*\libraries\SPIFFS\examples\SPIFFS_Test`）来源于ESP32官方未做修改，代码实现了“增删改查”的基本操作，并提供了一个SPI flash的IO测试程序。

&#x20;如果有需要，建议直接使用例程的代码进行操作。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.petoi.com/chinese/biboard/li-cheng/12.-wen-jian-xi-tong-spiffs.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
