ESP8266学习笔记3-闪存文件系统

3.3.1 闪存文件SPIFFS基本操作
程序来源:太极创客http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/spiffs/spiffs-operation/
物联网教程 / 第3章-用C/C++开发物联网

Arduino开发环境:
工具-开发板-NodeMCU 1.0(ESP-12E Module)

(1)新建文件并写入信息

/**********************************************************************
项目名称/Project           : 零基础入门学用物联网
程序名称/Program name      : esp8266-flash-write
团队/Team                 : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author               : CYNO 朔 
日期/Date(YYYYMMDD)      : 20191109
程序目的/Purpose           : 此程序用于演示如何向NodeMCU的SPIFFS中建立名为
                            notes.txt的文件,程序还将向该文件写入信息。
-----------------------------------------------------------------------
函数说明:
SPIFFS.open(file_name, "w"); 
以上函数有两个参数:
第一个参数是被操作的文件名称,本示例中该文件为/notes.txt
第二个参数"w" 代表写入文件信息。(如需了解如何读取信息,请参阅示例程序esp8266-flash-read)
***********************************************************************/


#include <FS.h>  
 
String file_name = "/taichi-maker/notes.txt"; //文件夹taichi-maker和名称notes
 
void setup() {
  Serial.begin(9600); //串口
  Serial.println("");
  //格式化文件,非必须初始化
  Serial.println("SPIFFS format start");
  SPIFFS.format();    // 格式化SPIFFS
  Serial.println("SPIFFS format finish");
  //启动文件系统,初始化必备
  if(SPIFFS.begin()){ // 启动SPIFFS
    Serial.println("SPIFFS Started."); 
  } else {
    Serial.println("SPIFFS Failed to Start.");
  }
  //新建文件并写入信息
  File dataFile = SPIFFS.open(file_name, "w");// 新建文件
  dataFile.println("Hello IOT World.");       // 写入字符串信息
  dataFile.close();                           // 完成文件写入后关闭文件
  Serial.println("Finished Writing data to SPIFFS");
}
 
void loop() {
}

File dataFile = SPIFFS.open(file_name, “w”) open函数可用于对SPIFFS进行操作。第一个参数file_name是被操作的文件名称,本示例中该文件为/taichi-maker/notes.txt,第二个参数"w"代表此操作为向SPIFFS写入文件信息。请注意:如果文件系统没有/taichi-maker/notes.txt文件,此操作将会在文件系统中建立该文件。如果文件系统有该文件,则程序将会重新建立该文件,即原有文件信息将会被覆盖。
dataFile.println(“Hello IOT World.”);用于向dataFile文件写入信息。信息内容为“Hello IOT World.”。
dataFile.close();用于关闭dataFile文件。结束文件操作后,应执行此操作。

(2)读取文件信息

  String file_name = "/taichi-maker/notes.txt"; //被读取的文件位置和名称
 
  //确认闪存中是否有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();                           

File dataFile = SPIFFS.open(file_name, “r”) open函数可用于对SPIFFS进行操作。第一个参数file_name是被操作的文件名称,本示例中该文件为/taichi-maker/notes.txt;第二个参数"r"代表此操作为读取文件信息。
dataFile.size() 该函数将会返回dataFile的大小。
dataFile.read() 将会读取dataFile文件内容。每调用一次该含税都会返回dataFile文件中一个字符。再次调用,将会返回下一个字符。以此类推,直到dataFile结尾。

(3)增加信息

#include <FS.h>
 
  String file_name = "/taichi-maker/notes.txt";              //被读取的文件位置和名称
 
  //确认闪存中是否有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");
  } 

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

(4)读取文件夹里文件目录

#include <FS.h>
 
String file_name = "/taichi-maker/myFile.txt"; //被读取的文件位置和名称
String folder_name = "/taichi-maker";         //被读取的文件夹
 
  //系统里默认已经有一个文件/taichi-maker/notes.txt
  //再添加一个文件/taichi-maker/myFile.txt
  File dataFile = SPIFFS.open(file_name, "w");// 建立File对象用于向SPIFFS中的file对象(即myFile.txt)写入信息
  dataFile.println("Hello Taichi-Maker.");    // 向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()); // 输出文件名
  }

SPIFFS.openDir(folder_name)中的openDir函数函将返回一个“目录”对象并且赋值给dir。此”目录”对象正是folder_name所存储的/taichi-maker/目录。后续程序对dir的所有操作都是针对/taichi-maker/所执行的。
dir.next()函数用于检查dir文件夹内的文件。我们可以想象dir文件夹里有一个指针,每一次调用next函数都会让指针向下挪动一格。每一次挪动一格,如果下一个位置有文件,则返回真。否则将会返回假。因此,while (dir.next())循环语句中的内容会依次显示dir文件夹中的每一个文件的文件名。

(5)删除指定文件

#include <FS.h>
 
String file_name = "/taichi-maker/notes.txt";    //被读取的文件位置和名称
 
  //从闪存中删除file_name文件
  if (SPIFFS.remove(file_name)) //删除一个指定文件
  {
    Serial.print(file_name);
    Serial.println(" remove sucess");
    
  } else {
    Serial.print(file_name);
    Serial.println(" remove fail");
  }                       

SPIFFS.remove(file_name)将file_name所指代的文件进行了删除操作。如果文件删除执行成功则返回真,否则返回假。

(6)显示文件信息

/**********************************************************************
项目名称/Project           : 零基础入门学用物联网
程序名称/Program name      : esp8266-flash-info
团队/Team                 : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author               : CYNO 朔
日期/Date(YYYYMMDD)      : 20200204
程序目的/Purpose           : 此程序用于演示如何使用FSInfo对象来显示闪存文件系统状态
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date    作者/Author      参考号/Ref    修订说明/Revision Description
***********************************************************************/
 
#include <FS.h>
 
FSInfo fs_info;
 
void setup() {
  Serial.begin(9600);
 
  SPIFFS.begin();       //启动SPIFFS
  Serial.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。后续的程序中,通过一系列语句将闪存状态信息通过串口监视器输出。

以上是关于ESP8266闪存文件系统的常用功能介绍。关于ESP8266闪存文件系统的更多操作介绍,请参考Arduino ESP8266官方页面中的介绍部分。该页面可点击以下链接前往。

https://arduino-esp8266.readthedocs.io/en/latest/filesystem.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值