美文网首页熊爸的学习时间
玩转 ESP32 + Arduino (二十一) SPIFFS

玩转 ESP32 + Arduino (二十一) SPIFFS

作者: 熊爸天下_56c7 | 来源:发表于2020-09-17 23:06 被阅读0次

    一. 文件系统 SPIFFS

    ESP32 自带SPIFFS.h库用来管理文件系统
    注意: 此文件系统是没用文件层次的 比如你建立一个 /doc/test.txt 那这个txt的名字就是 doc/test, 而不是在doc目录下有个 test.txt

    #include "SPIFFS.h"
    

    二. SPIFFS相关函数

    1. SPIFFS.begin(); //开启SPIFFS

    参数:
    - formatOnFail : 打开失败就格式化 (bool)
    - *basePath :  根目录 
    - maxOpenFiles  : 最大可打开文件数量
    
    返回值: 打开成功或者失败
    
    bool fs::SPIFFSFS::begin(bool formatOnFail = false, const char *basePath = "/spiffs", uint8_t maxOpenFiles = (uint8_t)'\n')
    
    SPIFFS.begin();
    

    2. SPIFFS.open //创建或打开文件

    参数:
    - path : 文件路径
    - mode : 打开方式, 可选:
                           FILE_READ (读文件) 
                           FILE_WRITE (写文件) 
                           FILE_APPEND (添加内容)
    返回值: 一个File类型的对象, 其实就是打开的文件对象
    
    File FS::open(const char* path, const char* mode){}
    

    我们可以看到 SPIFFS.open其实是继承自 FS类的

    File file = SPIFFS.open("/test.txt", FILE_WRITE);
    
    注意:

    File重载了 Boolean运算符, 如果文件打开了 file就为true

    if(!file){
         Serial.println("There was an error opening the file for writing");
         return;
    }
    

    关于File类型的函数放在下一节

    3. SPIFFS.format() //文件系统格式化

    SPIFFS.format();
    

    4. SPIFFS.exists("/test.txt") //判断有没有某个文件

    SPIFFS.exists("/test.txt");
    

    5. SPIFFS.remove("/test.txt"); //删除某个文件

    SPIFFS.exists("/test.txt")
    

    6. SPIFFS.rename("原文件名","新文件名"); //文件重命名

    7. SPIFFS.end(); //结束文件系统挂载

    三. File类相关函数

    1. file.name(); //读取文件的名字

    返回文件的名字, char *字符串

    2. file.print(""); //往文件中写入内容

    参数: 要写入的字符串
    返回值: 写入的char的个
    size_t Print::print(const char *)
    

    我们可以看到 File的print 是继承并扩展了 Print类

    f(file.print("TEST")) {
        Serial.println("File was written");
    }else {
        Serial.println("File write failed");
    }
    

    3. file.println(""); //往文件中写入一行内容

    这个方法有好多个重载, 输入内容的方式比较丰富,可用看一下源码了解一下

    file.println("xiongba,haha");
    

    4. file.printf(); //写入内容

    file.printf("tizhong:%dKG",90);
    

    5. file.find('!'); //在文件中寻找某个char或字符串

    返回布尔值!

      Serial.print("寻找!位置");
      Serial.println(file.find('!'));
    

    4. file.findUntil("haha","!"); //在文件中寻找某个char或字符串(遇到某字符串就停止)

    返回布尔值!

    file.findUntil("haha","!");
    

    5. file.close(); //关闭文件

    6. file.size(); //文件大小

    读模式下能返回文件大小,写模式下返回 -负值文件大小

    7. file.readString(); //读取字符串, 返回读取字符串

    8. file.readStringUntil(); //读取字符串, 遇到终止符终止, 返回读取字符串

    9. file.readBytes(); //读取数据到buf中,

      char *buf;
      file.readBytes(buf,15);
    

    10. file.readBytesUntil('1',buf,15); //读取数据到buf中, 遇到终止符终止

      uint8_t *buf;
      file.readBytesUntil(0x18,buf,15);
    
      char *buf;
      file.readBytesUntil('!',buf,15);
    

    三. 简单测试

    #include <Arduino.h>
    #include <SPIFFS.h>
    void setup()
    {
      Serial.begin(115200);
      delay(3000);
      Serial.println("opening SPIFFS");
      while (!SPIFFS.begin())
      {
        Serial.print("...");
      }
      Serial.println("SPIFFS OK!");
    
    
      File file = SPIFFS.open("/test.txt", FILE_WRITE);
      if (!file)
      {
        Serial.println("open file failed");
      }
      Serial.println(file.print("hello,xiongba!"));
      file.println("xiongba,haha");
      Serial.println(file.print("hello,xiongba!"));
      file.printf("tizhong:%dKG",90);
      file.close();
    
      
      file = SPIFFS.open("/test.txt", FILE_READ);
      Serial.print("可用file.available():");
      Serial.println(file.available());
      Serial.print("test.txt的大小:");
      Serial.println(file.size());
      Serial.print("读取文件");
      String data = file.readString();
      Serial.println(data);
      Serial.print("寻找字符串");
      Serial.println(file.find('!'));
      file.findUntil("haha","!");
      Serial.println(file.name());
      file.close();
    
      Serial.printf("SPIFFS的总体积: %d 字节\r\n", SPIFFS.totalBytes());
      Serial.printf("SPIFFS的已用体积: %d 字节\r\n", SPIFFS.usedBytes());
    
      Serial.print("现在存在/test.txt吗:");
      Serial.println(SPIFFS.exists("/test.txt"));
      Serial.println("现在把/test.txt改名为/test2.txt");
      SPIFFS.rename("/test.txt", "/test2.txt");
      Serial.print("现在存在/test.txt吗:");
      Serial.println(SPIFFS.exists("/test.txt"));
      Serial.print("现在存在/test2.txt吗:");
      Serial.println(SPIFFS.exists("/test2.txt"));
      Serial.println("删除/test2.txt");
      SPIFFS.remove("/test2.txt");
      Serial.print("现在还存在/test2.txt吗:");
      Serial.println(SPIFFS.exists("/test2.txt"));
      SPIFFS.end();
    }
    
    void loop()
    {
    }
    

    四. 测试FILE_WRITE和FILE_APPEND的区别(答案显而易见)

    先说结论: FILE_WRITE是把文件重写, FILE_APPEND是从源文件的基础上增量

    1.FILE_WRITE

    #include <Arduino.h>
    #include <SPIFFS.h>
    void setup()
    {
      Serial.begin(115200);
      delay(3000);
      Serial.println("opening SPIFFS");
      while (!SPIFFS.begin())
      {
        Serial.print("...");
      }
      Serial.println("SPIFFS OK!");
    
    
      File file = SPIFFS.open("/test.txt", FILE_WRITE);
      if (!file)
      {
        Serial.println("open file failed");
      }
      Serial.println(file.print("hello,xiongba!"));
      file.println("xiongba,haha");
      Serial.println(file.print("hello,xiongba!"));
      file.printf("tizhong:%dKG",90);
      file.close();
    
    
      file = SPIFFS.open("/test.txt", FILE_READ);
      Serial.print("可用file.available():");
      Serial.println(file.available());
      Serial.print("test.txt的大小:");
      Serial.println(file.size());
      Serial.print("读取文件");
      String data = file.readString();
      Serial.println(data);
      Serial.print("寻找字符串");
      Serial.println(file.find('!'));
      file.findUntil("haha","!");
      Serial.println(file.name());
      file.close();
    
      Serial.printf("SPIFFS的总体积: %d 字节\r\n", SPIFFS.totalBytes());
      Serial.printf("SPIFFS的已用体积: %d 字节\r\n", SPIFFS.usedBytes());
    
      SPIFFS.end();
    }
    
    void loop()
    {
    }
    

    2. FILE_APPEND模式

    File file = SPIFFS.open("/test.txt", FILE_APPEND);
    

    相关文章

      网友评论

        本文标题:玩转 ESP32 + Arduino (二十一) SPIFFS

        本文链接:https://www.haomeiwen.com/subject/tbqcektx.html