GyverLibs / FileData

Замена EEPROM для ESP8266/32 для хранения любых данных в файлах
MIT License
11 stars 2 forks source link

Чтение нескольких файлов из папки #2

Closed gausstechno closed 11 months ago

gausstechno commented 11 months ago

Хорошо, когда у тебя один файл с конфигами, а когда их несколько, начинаются проблемы Сама LittleFS выдаёт мне данные пофайлово, а как мне к этому процессу прикрутить библиотеку?

Читаю все файлы в папке через функцию openNextFile() и хотелось бы, чтобы библиотека научилась работать не с одним файлом.

Пока что как-то костыльно пытаюсь прикрутить реализацию моей идеи, но пока что не особо получается(

void readProfiles() {

  static DriveProfile temp_profile;
  static char charBuf[50];

  File profiles_dir = LittleFS.open(profiles_path);
  if(!profiles_dir) {
    Serial.println(F("[Profiles] Couldn't open profiles directory"));
  } if(!profiles_dir.isDirectory()) {
    Serial.println(F("[Profiles] Thats not directory!"));
  } if(profiles_dir) {
    Serial.println(F("[Profiles] Open profiles directory..."));
    Serial.print(F("[Profiles] Files in directory: "));
    Serial.print(profiles_dir.size());
    Serial.print(F("\n"));
  }

  File profile = profiles_dir.openNextFile();
  profiles_dir.getNextFileName().toCharArray(charBuf, 50);

  FileData data(&LittleFS, charBuf, 'B', &temp_profile, sizeof(temp_profile));
  while(profile) {
    Serial.print(F("[Profiles] Opening profile: "));
    Serial.print(profile.name());
    Serial.print(F(", data: \n"));
    while(profile.available()) {
      Serial.write(profile.read());
    }
    Serial.print(F("\n"));

    FDstat_t stat = data.read();

    switch (stat) {
      case FD_FS_ERR: Serial.println("[Filedata] FS Error");
        break;
      case FD_FILE_ERR: Serial.println("[Filedata] Error");
        break;
      case FD_READ: Serial.println("[Filedata] Data Read");Serial.println(charBuf);
        break;
    }

    Serial.println("Data read:");
    Serial.println(temp_profile.profile_id);
    Serial.println(temp_profile.profile_name);
    Serial.println(temp_profile.max_power);
    Serial.println(temp_profile.throttle_smooth);
    Serial.println(temp_profile.display_mode);
    Serial.println(temp_profile.security_level);

    profile = profiles_dir.openNextFile();
  }

  Serial.println(F("[Profiles] Close profiles directory."));
  profiles_dir.close();
}

Вывод сериал:

[Profiles] Open profiles directory...
[Profiles] Files in directory: 0     
[Profiles] Opening profile: default.txt, data: 
"profile_id":0
"profile_name":"Стандарт"
"max_power":500
"throttle_smooth":50
"display_mode":1  
"security_level":1
[Filedata] Data Read
/profiles/kids.txt
Data read:
0

0
0
0
0
[Profiles] Opening profile: sport.txt, data: 
"profile_id":2
"profile_name":"Спорт"
"max_power":3000
"throttle_smooth":50
"display_mode":2
"security_level":0
[Filedata] Data Read
/profiles/kids.txt
Data read:
0

0
0
0
0
[Profiles] Close profiles directory.
GyverLibs commented 11 months ago

Никаких проблем нет. Два файла - два разных названия, два разных объекта FileData

gausstechno commented 11 months ago

в общем суть в том, что хочу обработать неизвестное количество файлов, и я заранее не знаю, сколько их должно быть

gausstechno commented 11 months ago

сейчас я пытаюсь перезаписать временную структуру, чтобы с новой итерацией openNextFile() сохранить данные со следующего файла, тем самым я пытаюсь добиться вызволения данных из каждого файла

gausstechno commented 11 months ago

а сама библиотека не понимает такой же формат, как у Pairs, как я понимаю? видимо, и это ещё запинка для меня

GyverLibs commented 11 months ago

Библиотека пишет и читает файл как сырые бинарные данные

gausstechno commented 11 months ago

тогда с файлами понятно, но с чтением файлов из папки как по мне интересная идея, хотелось бы её добавления. если не сюда, то в Pairs

GyverLibs commented 11 months ago

Поэтому очевидно из файла, который не записан этой же библиотекой, она прочитает в структуру некорректный мусор

GyverLibs commented 11 months ago

Из папки никто не мешает читать, и это должно делаться снаружи библиотеки. Но никак не внутри