【PlatformIO】基于Arduino的ESP32 SPIFFS文件系统操作

文章目录

    • 概要
    • 程序代码
    • 视频

概要

SPIFFS文件系统的全称是Serial Peripheral Interface Flash File System‌ 它是一种专为嵌入式系统设计的轻量级文件系统,主要用于管理SPI NOR Flash存储器,如ESP8266和ESP32等微控制器上的Flash芯片。 SPIFFS特别适用于资源有限的环境,提供基本的文件读写功能,适合存储小文件,如配置文件和网页资源等‌

程序代码

#include "FS.h"
#include "SPIFFS.h"

// 列出指定目录下的文件和子目录
void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
    Serial.printf("Listing directory: %s\r\n", dirname);

    // 打开目录
    File root = fs.open(dirname);
    if(!root){
        Serial.println("- failed to open directory");
        return;
    }
    // 检查是否为目录
    if(!root.isDirectory()){
        Serial.println(" - not a directory");
        return;
    }

    // 打开目录的下一个文件
    File file = root.openNextFile();
    while(file){
        if(file.isDirectory()){    // 如果是目录,则打印目录名并递归列出子目录
            Serial.print("  DIR : ");
            Serial.println(file.name());
            if(levels){
                listDir(fs, file.path(), levels -1);
            }
        } else {            // 如果是文件,则打印文件名和大小
            Serial.print("  FILE: ");
            Serial.print(file.name());
            Serial.print("\tSIZE: ");
            Serial.println(file.size());
        }
        file = root.openNextFile();
    }
}

// 读取并显示文件内容
void readFile(fs::FS &fs, const char * path){
    Serial.printf("Reading file: %s\r\n", path);    // 打印正在读取的文件

    File file = fs.open(path);   // 打开文件
    if(!file || file.isDirectory()){
        Serial.println("- failed to open file for reading");
        return;
    }

     // 读取并打印文件内容
    Serial.println("- read from file:");
    while(file.available()){
        Serial.write(file.read());    
    }
    file.close();
}

// 写入内容到文件,如果文件不存在则创建
void writeFile(fs::FS &fs, const char * path, const char * message){
    Serial.printf("Writing file: %s\r\n", path);
    
    //打印正在写的文件
    File file = fs.open(path, FILE_WRITE);
    // 打开文件用于写入
    if(!file){
        Serial.println("- failed to open file for writing");
        return;
    }
    if(file.print(message)){
        Serial.println("- file written");
    } else {
        Serial.println("- write failed");
    }
    file.close();
}

// 向文件追加内容
void appendFile(fs::FS &fs, const char * path, const char * message){
    Serial.printf("Appending to file: %s\r\n", path);

    File file = fs.open(path, FILE_APPEND);
    if(!file){
        Serial.println("- failed to open file for appending");
        return;
    }
    if(file.print(message)){
        Serial.println("- message appended");
    } else {
        Serial.println("- append failed");
    }
    file.close();
}

void renameFile(fs::FS &fs, const char * path1, const char * path2){
    Serial.printf("Renaming file %s to %s\r\n", path1, path2);
    if (fs.rename(path1, path2)) {
        Serial.println("- file renamed");
    } else {
        Serial.println("- rename failed");
    }
}

void deleteFile(fs::FS &fs, const char * path){
    Serial.printf("Deleting file: %s\r\n", path);
    if(fs.remove(path)){
        Serial.println("- file deleted");
    } else {
        Serial.println("- delete failed");
    }
}

//函数显示读取文件内容所需的时间
void testFileIO(fs::FS &fs, const char * path){
    Serial.printf("Testing file I/O with %s\r\n", path);

    static uint8_t buf[512];
    size_t len = 0;
    File file = fs.open(path, FILE_WRITE);
    if(!file){
        Serial.println("- failed to open file for writing");
        return;
    }

    size_t i;
    Serial.print("- writing" );
    uint32_t start = millis();
    for(i=0; i<2048; i++){
        if ((i & 0x001F) == 0x001F){
          Serial.print(".");
        }
        file.write(buf, 512);
    }
    Serial.println("");
    uint32_t end = millis() - start;
    Serial.printf(" - %u bytes written in %u ms\r\n", 2048 * 512, end);
    file.close();

    file = fs.open(path);
    start = millis();
    end = start;
    i = 0;
    if(file && !file.isDirectory()){
        len = file.size();
        size_t flen = len;
        start = millis();
        Serial.print("- reading" );
        while(len){
            size_t toRead = len;
            if(toRead > 512){
                toRead = 512;
            }
            file.read(buf, toRead);
            if ((i++ & 0x001F) == 0x001F){
              Serial.print(".");
            }
            len -= toRead;
        }
        Serial.println("");
        end = millis() - start;
        Serial.printf("- %u bytes read in %u ms\r\n", flen, end);
        file.close();
    } else {
        Serial.println("- failed to open file for reading");
    }
}
 
// 创建一个新的目录
void createDir(fs::FS &fs, const char * path){
  // 打印正在创建的目录
  Serial.printf("Creating Dir: %s\n", path);
  if(fs.mkdir(path)){
  // 尝试创建目录,如果成功则打印成功信息,否则打印失败信息
      Serial.println("Dir created");
  } else {
      Serial.println("mkdir failed");
  }
}

// 删除一个目录及其所有内容
void removeDir(fs::FS &fs, const char * path){
  Serial.printf("Removing Dir: %s\n", path);
  if(fs.rmdir(path)){
  // 尝试删除目录,如果成功则打印成功信息,否则打印失败信息
      Serial.println("Dir removed");
  } else {
      Serial.println("rmdir failed");
  }
}

void setup(){
    Serial.begin(115200);
    if(!SPIFFS.begin()){    
        Serial.println("SPIFFS Mount Failed");
        return;
    }
    
    listDir(SPIFFS, "/", 0);
    //writeFile(SPIFFS, "/hello1.txt", "Hello ");
    //appendFile(SPIFFS, "/hello1.txt", "World!\r\n");
    //readFile(SPIFFS, "/hello1.txt");
    //renameFile(SPIFFS, "/hello.txt", "/foo.txt");
    //readFile(SPIFFS, "/foo.txt");
    deleteFile(SPIFFS, "/foo.txt");
    //deleteFile(SPIFFS, "/test.txt");
    //Serial.println( "Test complete" );
}

void loop(){

}

视频

【PlatformIO】基于Arduino的ESP32 SPIFFS文件系统操作

你可能感兴趣的:(esp32入门,linux,服务器,算法)