esp8266教程:文件系统之spiffs

公众号

欢迎扫码关注本人微信公众号:公众号上分享更多嵌入式知识和资料,分享个人学习嵌入式的心得体会。欢迎大家一起来玩呀。
在这里插入图片描述

esp8266教程:文件系统之spiffs

文件系统

文件系统是操作的系统的基础组成部分,不管是在linux还是Windows都支持文件系统,文件系统是什么?文件系统是我们对存储设备的一种管理方式。文件系统可以类比为我们生活当中的图书馆,如果没有图书馆管理,我们数据随意的写到储存设备上,其实就像将书全部扔到一个杂乱无章的房子是一样的,我们想找一本书,在堆满杂乱书籍的房子里简直是困难重重,如果是整齐摆放的书籍,我们按照找那本书按照索引号就可以很快找到了。对于我们要管理的数据也是一样,如果我们有文件系统要找到一个文件就非常的容易,修改文件也非常的容易,如果没有文件系统,我们需要很清楚的知道每个文件放置在存储设备的哪个地址上,数据存储的大小是多少,如果要扩大文件的大小是否需要移动存储位置,因为存储介质的擦写的寿命是有限的,所以不能经常擦写同一个地方,比如这个地方擦写很多次了,下次要存储东西的时候就换个地方擦写,这样存储设备的寿命就能延长一些,所以需要动态平衡擦写等等,文件系统就是为了给出统一的读写接口,文件的管理,擦写算法管理而存在的。

杂乱无章的书籍
在这里插入图片描述

整齐摆放的书籍
在这里插入图片描述

常见的文件系统类型

文件系统类型:
spiffs :对于嵌入设备定制的小文件系统,占用内存小
ext2 : 早期linux中常用的文件系统
ext3 : ext2的升级版,带日志功能
RAMFS : 内存文件系统,速度很快
NFS : 网络文件系统,由SUN发明,主要用于远程文件共享
MS-DOS : MS-DOS文件系统
VFAT : Windows 95/98 操作系统采用的文件系统
FAT : Windows XP 操作系统采用的文件系统
NTFS : Windows NT/XP 操作系统采用的文件系统
HPFS : OS/2 操作系统采用的文件系统
PROC : 虚拟的进程文件系统
ISO9660 : 大部分光盘所采用的文件系统
ufsSun : OS 所采用的文件系统
NCPFS : Novell 服务器所采用的文件系统
SMBFS : Samba 的共享文件系统
XFS : 由SGI开发的先进的日志文件系统,支持超大容量文件
JFS :IBM的AIX使用的日志文件系统
ReiserFS : 基于平衡树结构的文件系统
udf: 可擦写的数据光盘文件系统

文件系统系统的选择

文件系统有很多种,不同的操作的系统或者存储介质会选择不一样的文件系统,比如对于spiffs来说就是为了嵌入式设备而定制的精简版文件系统,优点是占用的内存非常小,而已不使用malloc分配内存,系统使用的内存由用户传入静态内存,缺点就是能存储的文件个数有限制,文件大小有限制,而且不能建立文件夹只有一级目录。在linux的条件下使用的文件系统又是不一样的比如ext3就是专门为高容量的EMMC存储介质而设计的,好处非常的多,比如对文件大小的限制想对spiffs来说就放的很宽了,文件个数的限制也没有,但是不好的地方就是占用的内存会比spiffs,但是因为这个文件系统使用在linux上,一般跑linux系统的设备内存都是比价充足的。所以说每个文件系统都有对应的优缺点,也有对应的使用场景,在合适的场景下选择合适的操作系统。

文件系统中文件的操作

在操作系统中,一般来说不管怎么样的文件系统,大家都可以使用标准的C库去使用,比如我们想打开一个文件系统的文件,可以使用fopen,关闭打开的文件可以使用fclose,如果要把文件读取出来可以使用fread,写文件可以使用fwrite等等函数。

esp8266 spiffs文件系统操作实例


void app_main(void)
{
    ESP_LOGI(TAG, "Initializing SPIFFS");
    
    esp_vfs_spiffs_conf_t conf = {
      .base_path = "/spiffs",
      .partition_label = NULL,
      .max_files = 5,
      .format_if_mount_failed = true
    };
    
    //挂载spiffs文件系统,挂载之后可以使用C库进行读写文件
    esp_err_t ret = esp_vfs_spiffs_register(&conf);

    if (ret != ESP_OK) {
        if (ret == ESP_FAIL) {
            ESP_LOGE(TAG, "Failed to mount or format filesystem");
        } else if (ret == ESP_ERR_NOT_FOUND) {
            ESP_LOGE(TAG, "Failed to find SPIFFS partition");
        } else {
            ESP_LOGE(TAG, "Failed to initialize SPIFFS (%s)", esp_err_to_name(ret));
        }
        return;
    }
    
    size_t total = 0, used = 0;
    //获取文件系统已经使用的大小和剩余的大小
    ret = esp_spiffs_info(NULL, &total, &used);
    if (ret != ESP_OK) {
        ESP_LOGE(TAG, "Failed to get SPIFFS partition information (%s)", esp_err_to_name(ret));
    } else {
        ESP_LOGI(TAG, "Partition size: total: %d, used: %d", total, used);
    }

    // 使用 POSIX and C标准接口进行操作文件
    //首先建立文件/spiffs/hello.txt
    ESP_LOGI(TAG, "Opening file");
    FILE* f = fopen("/spiffs/hello.txt", "w");
    if (f == NULL) {
        ESP_LOGE(TAG, "Failed to open file for writing");
        return;
    }
	char * p = "Hello World!\n";
    //在文件里面写入Hello World!\n
    fwrite(p,strlen(p),1,f);
    fclose(f);
    ESP_LOGI(TAG, "File written");

    //检查/spiffs/foo.txt这个文件是否存在,如果存在删除它
    struct stat st;
    if (stat("/spiffs/foo.txt", &st) == 0) {
        // 删除/spiffs/foo.txt文件
        unlink("/spiffs/foo.txt");
    }

    // 将/spiffs/hello.txt重新命名为/spiffs/foo.txt
    ESP_LOGI(TAG, "Renaming file");
    if (rename("/spiffs/hello.txt", "/spiffs/foo.txt") != 0) {
        ESP_LOGE(TAG, "Rename failed");
        return;
    }

    // 打开/spiffs/foo.txt文件
    ESP_LOGI(TAG, "Reading file");
    f = fopen("/spiffs/foo.txt", "r");
    if (f == NULL) {
        ESP_LOGE(TAG, "Failed to open file for reading");
        return;
    }
    char line[64];
    //读取一行数据,就是读取之前写入的“Hello World!\n”
    fgets(line, sizeof(line), f);
    //关闭文件
    fclose(f);
    //找打“Hello World!\n”字符串的\n,然后替换成'\0'
    char* pos = strchr(line, '\n');
    if (pos) {
        *pos = '\0';
    }
    //将“Hello World!”打印出来
    ESP_LOGI(TAG, "Read from file: '%s'", line);

    //和挂载函数esp_vfs_spiffs_register反向操作,卸载spiffs文件系统
    esp_vfs_spiffs_unregister(NULL);
    ESP_LOGI(TAG, "SPIFFS unmounted");
}

/和挂载函数esp_vfs_spiffs_register反向操作,卸载spiffs文件系统
    esp_vfs_spiffs_unregister(NULL);
    ESP_LOGI(TAG, "SPIFFS unmounted");
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值