• 【ESP32_8266_WiFi (四)】闪存文件系统基本操作


    闪存文件系统基本操作

    不知道您有没有想过,当我们上传程序给ESP8266时,我们的程序具体存放在什么地方呢?

    每一个ESP8266都配有一个闪存,这个闪存很像是一个小硬盘,我们上传的文件就被存放在这个闪存里。这个闪存的全称是Serial Peripheral Interface Flash File System(SPIFFS)。

    除了可以存放上传的程序以外,我们还可以将网页文件或者系统配置文件存放在ESP8266的闪存中。在这节课里,我们将学习如何利用程序对闪存文件系统(SPIFFS)进行文件读取和修改。

    在这里插入图片描述

    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   
     
    String file_name = "/taichi-maker/notes.txt"; //被读取的文件位置和名称
     
    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");// 建立File对象用于向SPIFFS中的file对象(即/notes.txt)写入信息
      dataFile.println("Hello IOT World.");       // 向dataFile写入字符串信息
      dataFile.close();                           // 完成文件写入后关闭文件
      Serial.println("Finished Writing data to SPIFFS");
    }
     
    void loop() {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

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

    /**********************************************************************
    项目名称/Project           : 零基础入门学用物联网
    程序名称/Program name      : esp8266-flash-read
    团队/Team                 : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
    作者/Author               : CYNO 朔
    日期/Date(YYYYMMDD)      : 20191109
    程序目的/Purpose           : 此程序用于演示如何从NodeMCU的内置SPIFFS中存储的文件notes.txt读取数据。
                               notes.txt 文件内容将会通过串口监视器显示出来供用户确认。
                               注意在使用本程序以前需要先将notes.txt 文件上传到NodeMCU开发板的SPIFFS中
    -----------------------------------------------------------------------
    修订历史/Revision History
    日期/Date    作者/Author      参考号/Ref    修订说明/Revision Description
    -----------------------------------------------------------------------
    函数说明:
    SPIFFS.open(file_name, "r"); 
    以上SPIFFS函数有两个参数:
    第一个参数是被操作的文件名称,本示例中该文件为/notes.txt
    第二个参数"r" 代表读取文件信息。(如需了解如何写入信息,请参阅示例程序esp8266-flash-write)
    ***********************************************************************/
     
    #include 
     
    String file_name = "/taichi-maker/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() {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

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

    /**********************************************************************
    项目名称/Project           : 零基础入门学用物联网
    程序名称/Program name      : esp8266-flash-append
    团队/Team                 : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
    作者/Author               : CYNO 朔 
    日期/Date(YYYYMMDD)      : 20191109
    程序目的/Purpose           : 此程序用于演示如何向NodeMCU的内置SPIFFS中存储的文件
                                notes.txt添加数据。                      
    -----------------------------------------------------------------------  
    函数说明:
    SPIFFS.open(file_name, "a"); 
    以上SPIFFS函数有两个参数:
    第一个参数是被操作的文件名称,本示例中该文件为/notes.txt
    第二个参数"a" 代表添加文件信息。(如需了解如何读取信息,请参阅示例程序esp8266-flash-read)
    此示例程序所演示的是向SPIFFS中的文件里添加信息。这一操作写入信息有所区别。
    添加信息是不会删除文件内原有信息,而是在原有信息后面添加新的信息。
    但写入操作(示例 esp8266-flash-write.ino)是将文件内容完全清除,重新写入新信息。    
    ***********************************************************************/
     
    #include 
     
    String file_name = "/taichi-maker/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() {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    4 通过程序读取目录内容

    /**********************************************************************
    项目名称/Project           : 零基础入门学用物联网
    程序名称/Program name      : esp8266-flash-folder-read
    团队/Team                 : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
    作者/Author               : CYNO 朔
    日期/Date(YYYYMMDD)      : 20191109
    程序目的/Purpose           : 此程序用于演示如何从NodeMCU的内置SPIFFS中文件夹里读取文件信息
                               文件夹内容将会通过串口监视器显示出来。
                               
    -----------------------------------------------------------------------
    修订历史/Revision History
    日期/Date    作者/Author      参考号/Ref    修订说明/Revision Description
    -----------------------------------------------------------------------
    函数说明:
    SPIFFS.openDir(folder_name);
    以上函数打开指定目录并返回一个目录对象实例。
    ***********************************************************************/
     
     
    #include 
     
    String file_name = "/taichi-maker/myFile.txt"; //被读取的文件位置和名称
    String folder_name = "/taichi-maker";         //被读取的文件夹
     
    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 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()); // 输出文件名
      }
    }
     
    void loop() {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

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

    /**********************************************************************
    项目名称/Project           : 零基础入门学用物联网
    程序名称/Program name      : esp8266-flash-remove
    团队/Team                 : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
    作者/Author               : CYNO 朔 
    日期/Date(YYYYMMDD)      : 20191109
    程序目的/Purpose           : 此程序用于演示如何删除SPIFFS中存储的文件                        
    ***********************************************************************/
     
    #include 
     
    String file_name = "/taichi-maker/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() {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    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 
     
    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() {
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    详情请看---->
    http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/spiffs/spiffs-operation/


    内容来自 -----> 太极创客
    详情可见太极创客官网,内有Arduino、ESP32等详细教程
    http://www.taichi-maker.com

  • 相关阅读:
    Linux UWB Stack实现——MCPS帧处理
    如何识别图片中的文字?三种方法轻松搞定
    Netty源码分析之NIO
    jquery 登录-记住密码
    2023年十大地推拉新接单平台和网推接单平台,都是一手单
    杭电多校-Darnassus-(最小生成树本质+预处理+链式向前星)
    获取、设置注释的值
    【Docker-k8s学习和实战】(六)docker镜像相关管理操作:增、删、改、查、维护
    几何向量:向量到平面投影和LookAt
    初识vue渲染函数-rander
  • 原文地址:https://blog.csdn.net/K3169/article/details/127831742