ESP8266闪存文件系统(SPIFFS)

2024-04-18 00:28

本文主要是介绍ESP8266闪存文件系统(SPIFFS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

开发环境:

1、安装ESP8266的开发环境,如Arduino IDE。

2、下载并安装ESP8266的相关开发库和工具。

我们使用的是Arduino IDE。

基本介绍:

  每一个ESP8266都配有一个闪存,这个闪存很像是一个小硬盘,我们上传的文件就被存放在这个闪存里。这个闪存的全称是Serial Peripheral Interface Flash File System(SPIFFS)。除了可以存放上传的程序以外,我们还可以将网页文件或者系统配置文件存放在ESP8266的闪存中。

 

 通过程序向闪存文件系统写入信息:

 

#include <FS.h>  String file_name = "/chenjiajun/notes.txt"; //被读取的文件位置和名称void setup() {Serial.begin(9600);Serial.println("");Serial.println("SPIFFS format start");SPIFFS.format();    // 格式化SPIFFSSerial.println("SPIFFS format finish");if(SPIFFS.begin()){ // 启动SPIFFSSerial.println("SPIFFS Started.");} else {Serial.println("SPIFFS Failed to Start.");}File dataFile = SPIFFS.open(file_name, "w");// 建立File对象用于向SPIFFS中的file对象(即/notes.txt)写入信息dataFile.println("Hello World.");       // 向dataFile写入字符串信息dataFile.close();                           // 完成文件写入后关闭文件Serial.println("Finished Writing data to SPIFFS");
}void loop() {
}

代码解析:

1、这里的串口函数是为了打印一些信息,可以说明程序跑到哪里和目前的状态。

2、我们首先要调用SPIFFS.format()来格式化SPIFFS。

3、之后建立File对象用于向SPIFFS中的file对象,这里的'W',表明要写。

4、之后调用建立好的对象,直接可以写入信息,存放到闪存文件系统里面。

5、在使用SPIFFS存储文件以前,我们必须使用#include "FS.h"。

6、之后dataFile.close(); 关闭这个文件。

通过程序从闪存文件系统读取信息:

#include <FS.h>String file_name = "/chenjiajun/notes.txt";              //被读取的文件位置和名称void setup() {Serial.begin(9600);Serial.println("");if(SPIFFS.begin()){ // 启动闪存文件系统Serial.println("SPIFFS Started.");} else {Serial.println("SPIFFS Failed to Start.");}//确认闪存中是否有file_name文件if (SPIFFS.exists(file_name)){Serial.print(file_name);Serial.println(" FOUND.");} else {Serial.print(file_name);Serial.print(" NOT FOUND.");}//建立File对象用于从SPIFFS中读取文件File dataFile = SPIFFS.open(file_name, "r"); //读取文件内容并且通过串口监视器输出文件信息for(int i=0; i<dataFile.size(); i++){Serial.print((char)dataFile.read());       }//完成文件读取后关闭文件dataFile.close();                           
}void loop() {
}

SPIFFS.exists(file_name)用于检查闪存文件系统中有file_name文件(注:file_name变量具体信息在本程序第23行)。该函数返回值为布尔型。如果文件存在则返回真,否则将返回假。

File dataFile = SPIFFS.open(file_name, "r");这条语句中,open函数可用于对SPIFFS进行操作。该函数共有两个参数。第一个参数file_name是被操作的文件名称,本示例中该文件为/chenjiajun/notes.txt
第二个参数"r"代表此操作为读取文件信息。

循环条件使用了函数dataFile.size()。该函数将会返回dataFile的大小。循环语句体中,dataFile.read()将会读取dataFile文件内容。每调用一次该函数都会返回dataFile文件中一个字符。再次调用,将会返回下一个字符。以此类推,直到dataFile结尾。通过for循环语句,程序将会依次读取dataFile文件内容,并且将文件内容逐字符输出于串口监视器中。

通过程序向闪存文件系统文件添加信息:

#include <FS.h>String file_name = "/chenjiajun/notes.txt";              //被读取的文件位置和名称void setup() {Serial.begin(9600);Serial.println("");if(SPIFFS.begin()){ // 启动闪存文件系统Serial.println("SPIFFS Started.");} else {Serial.println("SPIFFS Failed to Start.");}//确认闪存中是否有file_name文件if (SPIFFS.exists(file_name)){Serial.print(file_name);Serial.println(" FOUND.");File dataFile = SPIFFS.open(file_name, "a");// 建立File对象用于向SPIFFS中的file对象(即/notes.txt)写入信息dataFile.println("This is Appended Info."); // 向dataFile添加字符串信息dataFile.close();                           // 完成文件操作后关闭文件   Serial.println("Finished Appending data to SPIFFS");} else {Serial.print(file_name);Serial.print(" NOT FOUND.");}}void loop() {
}

File dataFile = SPIFFS.open(file_name, "a");这条语句中,open函数可用于对SPIFFS进行操作。该函数共有两个参数。第一个参数file_name是被操作的文件名称,第二个参数"a"代表向该文件添加信息。请留意,此处的添加信息是不会删除文件内原有信息,而是在原有信息后面添加新的信息。这与但写入操作是有所区别的。写入操作是将文件内容完全清除,重新写入新信息。
程序的第41行,dataFile.println("This is Appended Info."),此语句作用将会向dataFile文件尾部添加双引号中的信息内容,也就是在文件尾部添加“This is Appended Info.”。

通过程序读取目录内容:

#include <FS.h>String file_name = "/chenjiajun/myFile.txt"; //被读取的文件位置和名称
String folder_name = "/chenjiajun";         //被读取的文件夹void setup() {Serial.begin(9600);Serial.println("");if(SPIFFS.begin()){ // 启动闪存文件系统Serial.println("SPIFFS Started.");} else {Serial.println("SPIFFS Failed to Start.");}File dataFile = SPIFFS.open(file_name, "w");// 建立File对象用于向SPIFFS中的file对象(即myFile.txt)写入信息dataFile.println("Hello chenjiajun.");    // 向dataFile写入字符串信息dataFile.close();                           // 完成文件写入后关闭文件Serial.println(F("Finished Writing data to SPIFFS"));// 显示目录中文件内容以及文件大小Dir dir = SPIFFS.openDir(folder_name);  // 建立“目录”对象while (dir.next()) {  // dir.next()用于检查目录中是否还有“下一个文件”Serial.println(dir.fileName()); // 输出文件名}
}void loop() {
}

建立了一个字符串变量。该变量用于存储文件夹名。其中/代表根目录。/tchenjiajun/代表根目录下的chenjiajun目录。

本程序第41行SPIFFS.openDir(folder_name)中的openDir函数函将返回一个“目录”对象并且赋值给dir。此”目录”对象正是folder_name所存储的/chenjiajun/目录。后续程序对dir的所有操作都是针对/chenjiajun/所执行的。

本程序第43行while循环语句的循环条件是dir.next()的返回值。dir.next()函数用于检查dir文件夹内的文件。我们可以想象dir文件夹里有一个指针,每一次调用next函数都会让指针向下挪动一格。每一次挪动一格,如果下一个位置有文件,则返回真。否则将会返回假。因此,while (dir.next())循环语句中的内容会依次显示dir文件夹中的每一个文件的文件名。

从闪存文件系统中删除文件:

#include <FS.h>String file_name = "/chenjiajun/notes.txt";              //被读取的文件位置和名称void setup() {Serial.begin(9600);Serial.println("");if(SPIFFS.begin()){ // 启动闪存文件系统Serial.println("SPIFFS Started.");} else {Serial.println("SPIFFS Failed to Start.");}//从闪存中删除file_name文件if (SPIFFS.remove(file_name)){Serial.print(file_name);Serial.println(" remove sucess");} else {Serial.print(file_name);Serial.println(" remove fail");}                       
}void loop() {
}

通过使用SPIFFS.remove(file_name)file_name所指代的文件进行了删除操作。另外,SPIFFS.remove(file_name)的返回值为布尔型。如果文件删除执行成功则返回真,否则返回假

显示闪存文件系统信息:

#include <FS.h>FSInfo fs_info;void setup() {Serial.begin(9600);SPIFFS.begin();       //启动SPIFFSSerial.println("");Serial.println("SPIFFS Started.");// 闪存文件系统信息SPIFFS.info(fs_info);// 可用空间总和(单位:字节)Serial.print("totalBytes: ");     Serial.print(fs_info.totalBytes); Serial.println(" Bytes"); // 已用空间(单位:字节)Serial.print("usedBytes: "); Serial.print(fs_info.usedBytes);Serial.println(" Bytes"); // 最大文件名字符限制(含路径和'\0')Serial.print("maxPathLength: "); Serial.println(fs_info.maxPathLength);// 最多允许打开文件数量Serial.print("maxOpenFiles: "); Serial.println(fs_info.maxOpenFiles);// 存储块大小Serial.print("blockSize: "); Serial.println(fs_info.blockSize);// 存储页大小Serial.print("pageSize: ");Serial.println(fs_info.pageSize);
}void loop() {
}

FSInfo fs_info;建立了FSInfo 对象,用于存储闪存状态信息。SPIFFS.info(fs_info);。通过info函数将闪存状态信息赋给fs_info。后续的程序中,通过一系列语句将闪存状态信息通过串口监视器输出。具体信息内容可参考程序注释部分。

通过Arduino IDLE向闪存文件系统上传文件:

这篇关于ESP8266闪存文件系统(SPIFFS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/913277

相关文章

【Linux文件系统】被打开的文件与文件系统的文件之间的关联刨析总结

操作系统管理物理内存以及与外设磁盘硬件进行数据的交换 操作系统如何管理物理内存呢? 其实操作系统内核先对内存先描述再组织的!操作系统管理内存的基本单位是4KB,操作系统会为每一个4KB大小的物理内存块创建一个描述该4KB内存块的struct page结构体,该结构体存储着这4KB内存块的属性信息,通过管理struct page来对内存进行管理,page结构体的大小比较小,OS通常将它们组成一个

【操作系统】第五章 文件系统

文件系统 5.1 概述5.2 文件5.2.1 文件及文件系统的概念5.2.2 文件的属性5.2.3 文件的操作5.2.4 文件的类型文件分类 5.3 文件的访问文件的逻辑结构顺序文件顺序文件的优缺点 索引文件索引顺序文件直接文件和哈希文件 5.4 文件保护5.5 文件目录文件控制块(FCB)文件控制块的内容 文件目录索引结点磁盘索引结点内存索引结点 单级目录结构二级目录结构多级目录结构

第四章 文件系统 文件系统基础

原文地址:第四章 文件系统 —— 王道操作系统 – Beatless 目录 一、文件系统基础 文件的基本概念 文件控制块和索引节点 文件的操作 文件保护 文件的逻辑结构 文件的物理结构 一、文件系统基础 文件的基本概念 文件是以硬盘为载体的存储在计算机上的信息集合,文件可以是文本文档、图片或程序等。 在系统运行的时候,计算机以进程为基本单位进行资源的调度和分配;而在用户

Linux驱动开发笔记(十三)Sysfs文件系统

文章目录 前言一、Sysfs1.1 Sysfs的引入1.2 Sysfs的目录结构1.2 Sysfs的目录详解1.2.1 devices1.2.2 bus1.2.3 class1.2.4 devices、bus、class目录之间的关系1.2.5 其他子目录 二、Sysfs使用2.1 核心数据结构2.2 相关函数2.2.1 kobject_create_and_add2.2.2 kobjec

Node.js文件系统之文件监听

4.监听文件       fs.watchFile()       fs.watchFileSync()       fs.watch       FSWatcher类 // 导入模块const fs = require('fs');// 监听文件的变化//curr当前的修改的状态,prev上一次文件修改的状态// interval:1000每隔一段时间检测文件变化fs.watc

云计算【第一阶段(18)】磁盘管理与文件系统

一、磁盘基础 磁盘(disk)是指利用磁记录技术存储数据的存储器。 磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。 早期计算机使用的磁盘是软磁盘(Floppy Disk,简称软盘),如今常用的磁盘是硬磁盘(Hard disk,简称硬盘)。 也就是现在说的硬盘就相当于是说我们的磁盘。 二、磁盘结构 磁盘分为: 机械硬盘(HDD)和固态硬盘(SS

Linux开发讲课7---Linux sysfs文件系统

一、sysfs文件系统介绍         Sysfs(System Filesystem)是Linux内核提供的一种虚拟文件系统,用于向用户空间公开有关设备和驱动程序的信息。它类似于/proc文件系统,但是专注于设备和驱动程序信息,而非进程信息。         Sysfs通过文件和目录的方式组织信息,其中每个文件或目录对应于系统中的一个设备、驱动程序或者其他内核对象。这些文件通常包含有关设

ESP8266 Arduino 不使用Delay让Led闪烁

因为Arduino Delay 函数会阻塞线程,使用millis 方法实现Led闪烁。 当然也可以使用Timer 来达到同样的效果。 //非阻塞//LED灯闪烁unsigned long previousMillis = 0;const long interval = 1000; //灯闪烁的时间间隔#define D5 14void setup(){pinMode(LE

ESP8266 按钮输入控制继电器响应

#include <Bounce2.h> //引入//NodeMcu的管脚定义#define D0 16#define D1 5#define D2 4#define D3 0#define D4 2//板载Led灯#define D5 14#define D6 12#define D7 13#define D8 15B

Arduino ESP8266 清空WIFI配置信息

#include <Arduino.h>#include <ESP8266WiFi.h>#include <ESP8266HTTPClient.h>#include <DNSServer.h>//密码直连将其三个库注释#include <ESP8266WebServer.h>#include <CustomWiFiManager.h>const char Icon[] PROGMEM =