Удаление файлов с sd карты

Fenics_
Offline
Зарегистрирован: 15.03.2018

Доброго времени суток. Мне нужно написать дата логгер, который каждый час записывает данные на флешку. Соответсвенно, рано или поздно объем будеи исчерпан, и нужно затирать файлы с начала (самые старые). Написал простой тестовый код, но он удаляет первый начальынй файл, а дальше новые.  Соотвентственно на карте остаются 5 файлов 1.txt, 2.txt, 3.txt, 4.txt ,n.txt.  Кто нибудь писал что то подобное? Можете помочь?

 
 
Fenics_
Offline
Зарегистрирован: 15.03.2018


#include <SPI.h>
#include <SD.h>

File myFile;
File root;
String fileName = "hf";
int i=0;
void setup() {
  if (!SD.begin(4)) {
    return;
  }
  root = SD.open("/");
}

void loop() {
    if(i>4){
      myFile = root.openNextFile();
      fileName = myFile.name();
      SD.remove(fileName);
      root.rewindDirectory();
    }
    myFile = SD.open(String(i)+".txt", FILE_WRITE);
    myFile.println(fileName);
    myFile.close();
    i++;
    delay(500);
}

 

b707
Offline
Зарегистрирован: 26.05.2017

вопрос, в чем смысл строк с 16 по 21? Зачем открывать "NextFile" и потом его удалять? Есть же переменная i. в которой хранится индекс очередного файла - вот ее и надо использовать.

Я бы сделал так: - когда подходит время писать файл номер "i" - проверяем, есть ли уже такой на карте. Если нет - просто создаем новый. если уже есть - сначала стираем старый, потом пишем новый. Таким образом всегда будет стираться самый старый файл.

 

Fenics_
Offline
Зарегистрирован: 15.03.2018

Это я уже экспериментировал, изначально там было так. Код просто идентично работает. В данном примере i это просто рандомное название. Потом это будет дата. На карте получится к примеру 5000 файлов. Я не могу сравнивать название файла, так как не знаю, какая дата.Я хочу сделать так: когда объем карты почти заполнится, возврашаемся в начала каталога (как я понял, это делает функция rewindDirectory), далее открываем, получаем имя лежащего там файла( это следующие 2 функции), удаляем его, далее происходит создание нового файла и программе нужно снова вернуться в начало каталога и проделать идентичную операцию. Но в начало каталога он почему то возвращается только первый раз

       root.rewindDirectory();
       myFile = root.openNextFile();
       fileName = myFile.name();
       SD.remove(fileName);
    

 

b707
Offline
Зарегистрирован: 26.05.2017

Fenics_ пишет:

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

 

а с чего вы взяли, что записи в каталоге у вас будут идти в порядке создания файлов? - это верно только для свежеотформатипрованной карты. с которой еще не стирали ни одного файла. Как только вы начнете удалять файлы из каталога. файловая система будет вписывать новые на освободившиеся места и порядок файлов перепутается. Точне даже не перепутается - а фактически изменится на обратный - и вы  будете стирать самый свежий файл.

Fenics_
Offline
Зарегистрирован: 15.03.2018

А, вот почему у меня только первый раз удаляет старый файл. Спасибо за разъяснение) Тогда без имени файла тут не обойтись?

b707
Offline
Зарегистрирован: 26.05.2017

Fenics_ пишет:

 Тогда без имени файла тут не обойтись?

думаю да, надо научиться вычислять самый старый файл в каталоге. ИМХО, имя файла в виде "прямой" даты - не самый удобный вариант для этого.

Но если дату записывать в обратном порядке, типа 20180315 - сортировать файлы по дате будет легче.

Fenics_
Offline
Зарегистрирован: 15.03.2018

Спасибо, буду пробовать

Fenics_
Offline
Зарегистрирован: 15.03.2018

Сделал, вдруг кому пригодится



#include <SPI.h>
#include <SD.h>

File myFile;
File root;
String fileName = "hf";
String temp;
bool forbid = true;
int i=0;
void setup() {
  if (!SD.begin(4)) {
    return;
  }
  root = SD.open("/");
}

void loop() {
    if(i>5){
      if(forbid){
        root.rewindDirectory();
        forbid = false;
      }
      myFile = root.openNextFile();
      if(!myFile){
        root.rewindDirectory();
      }
      fileName = myFile.name();
      SD.remove(fileName);
    }
    myFile = SD.open(String(i)+".txt", FILE_WRITE);
    myFile.println((String)i);
    myFile.close();
    i++;
    delay(500);
}

 

Logik
Offline
Зарегистрирован: 05.08.2014

Тут без текущей без даты - никак. Иначе сутки не включали - пропуск и однозначное соответствие логов дням нарушится.  А если есть дата, то есть и день недели. Потому я делаю так. В Пн -пишу в 1.txt, Вт -пишу в 2.txt,  и т.д., а если дата файла соответствующая текущему дню недели и текущая дата не совпадает - удаляю файл нафиг, он с прошлой недели. Лог за неделю как раз то, что надо.

Fenics_
Offline
Зарегистрирован: 15.03.2018

Да, этот код предполагает, что текущая дата записывается в качестве имени файла. Если сутки не включали, ничего страшного, когда включат, появится файл с новой датой

Logik
Offline
Зарегистрирован: 05.08.2014

Где? В мечтах? Имя Вы из int i; формируете (да еще и в стрингах оно красуется ))), и значения его как i++ формируете.

Fenics_
Offline
Зарегистрирован: 15.03.2018

Еще раз повторюсь, это тестовый код, цель которого - удалять старые файлы при наступлении какого либо события. Имя файла естественно будет задавать функция, которая возвращает текущую дату в виде строки.