esp32 littfs 读写.ini 文件 将相关操作封装为类
时间: 2024-02-22 15:58:22 浏览: 105
可以将 LittleFS 操作封装为一个类,方便在程序中进行调用和管理。以下是一个简单的示例类,可以读写 `.ini` 文件中的配置信息:
```c++
#include <LittleFS.h>
class ConfigManager {
public:
ConfigManager(const char* filename) {
filename_ = filename;
file_ = LittleFS.open(filename_, "r+");
if (!file_) {
// 文件不存在,创建新文件
file_ = LittleFS.open(filename_, "w");
if (file_) {
file_.close();
file_ = LittleFS.open(filename_, "r+");
}
}
}
~ConfigManager() {
file_.close();
}
String get(const char* key) {
String value;
file_.seek(0);
while (file_.available()) {
String line = file_.readStringUntil('\n');
line.trim();
if (line.length() == 0 || line.startsWith(";") || line.startsWith("#")) {
// 跳过注释和空行
continue;
}
int pos = line.indexOf('=');
if (pos == -1) {
// 不是有效的配置项
continue;
}
String k = line.substring(0, pos);
k.trim();
if (strcmp(k.c_str(), key) == 0) {
value = line.substring(pos + 1);
value.trim();
break;
}
}
return value;
}
void set(const char* key, const char* value) {
File tmp_file = LittleFS.open("/tmp.ini", "w");
file_.seek(0);
bool found = false;
while (file_.available()) {
String line = file_.readStringUntil('\n');
if (line.startsWith(";") || line.startsWith("#")) {
// 注释行,直接写入新文件
tmp_file.println(line);
continue;
}
line.trim();
if (line.length() == 0) {
// 空行,直接写入新文件
tmp_file.println(line);
continue;
}
int pos = line.indexOf('=');
if (pos == -1) {
// 不是有效的配置项,直接写入新文件
tmp_file.println(line);
continue;
}
String k = line.substring(0, pos);
if (strcmp(k.c_str(), key) == 0) {
// 找到了要修改的配置项,写入新值
tmp_file.print(key);
tmp_file.print("=");
tmp_file.println(value);
found = true;
} else {
// 其他配置项,直接写入新文件
tmp_file.println(line);
}
}
if (!found) {
// 没有找到要修改的配置项,追加到文件末尾
tmp_file.print(key);
tmp_file.print("=");
tmp_file.println(value);
}
tmp_file.close();
file_.close();
LittleFS.remove(filename_);
LittleFS.rename("/tmp.ini", filename_);
file_ = LittleFS.open(filename_, "r+");
}
private:
const char* filename_;
File file_;
};
```
使用示例:
```c++
#include <WiFi.h>
#include "ConfigManager.h"
ConfigManager config("/config.ini");
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(config.get("ssid").c_str(), config.get("password").c_str());
// 其他初始化代码
}
void loop() {
// 读取配置信息
String ssid = config.get("ssid");
String password = config.get("password");
Serial.printf("SSID: %s, password: %s\n", ssid.c_str(), password.c_str());
// 修改配置信息
config.set("password", "new_password");
delay(1000);
}
```
注意,这只是一个简单的示例,没有考虑到多线程和并发访问的问题,需要根据实际情况进行改进。
阅读全文