# 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/kuai-su-shang-shou-zhi-nan#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](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fdocs%2F-MX3tyQMeWdIjkYy-P9V%2F-MX3u8f43nV4QyyzHETi%2F0.png?generation=1617137541387429\&alt=media)

转到“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="https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FF6UhnxplrBPWiK76LSt0%2Fimage.png?alt=media&#x26;token=d8aa64c9-2a85-4522-b78c-3a17b89a005f" alt=""><figcaption></figcaption></figure>

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

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

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

<figure><img src="https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2FlowK9ss1OlBuBjs6ZP4z%2Fimage.png?alt=media&#x26;token=9090ad89-b5f6-489f-87a3-9c3b507a6719" alt=""><figcaption></figcaption></figure>

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

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fdocs%2F-MX3tyQMeWdIjkYy-P9V%2F-MX3u8f9AePOYGCR7f4O%2F5.png?generation=1617137541389957\&alt=media)

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

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fdocs%2F-MX3tyQMeWdIjkYy-P9V%2F-MX3u8fA-be4lWnaeJlG%2F6.png?generation=1617137541404194\&alt=media)

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

<figure><img src="https://201656985-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MQ6a951Q6Jn1Zzt5Ajr-3369173170%2Fuploads%2Fj0BSWlAP2PSBX7ADFHAV%2FSPIFFS%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6%E6%8C%89%E9%92%AE_cn.png?alt=media&#x26;token=781b4114-530c-4bdb-8e82-09b9377edf55" alt=""><figcaption></figcaption></figure>

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

![](https://201656985-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2Fdocs%2F-MX3tyQMeWdIjkYy-P9V%2F-MX3u8fCs_JnT93T_S81%2F8.png?generation=1617137541387720\&alt=media)

### 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;如果有需要，建议直接使用例程的代码进行操作。
