SD Datei nach X Tagen automtisch löschen

Hallo zusammen,

ich möchte nach X Tagen automatisch einige Datei auf der SD-Card löschen.

Doch wie komme ich an das Erstellungsdatum der Dateien?

Grüße
speedy

Das musst du reinschreiben, wenn du's weisst.

Die normalen SD Libraries machen das übrigens nicht ( die sind froh wenn sie die Datei überhaupt finden ),
da müsstest du dich etwas reinknien.

Aber warum löschen? Die kleinsten SD Karten sind 2GB heutzutage, die kriegst du nie voll.
Eventuell jeden Monat ein neues Verzeichnis anlegen, und darin eine Datei pro Tag ...

Du könntest die Datei nach dem Datum benennen.
Grüße Uwe

uwefed:
Du könntest die Datei nach dem Datum benennen.

... oder das Datum in die erste Zeile der (selbst erstellten) Datei schreiben. Im Programmablauf müsste dazu jedoch die Datei geöffnet, das Datum ausgelesen und die Datei wieder geschlossen werden. Nach erfolgter Prüfung wird die Datei dann ggf. entfernt.

HI,

danke für eure Antworten.

uwefed:
Du könntest die Datei nach dem Datum benennen.

Ui, das habe ich ja von Haus aus, daran habe ich garnicht gedacht.

Manchmal sieht man den Wald vor lauter Bäume nicht grins

Aber warum löschen? Die kleinsten SD Karten sind 2GB heutzutage, die kriegst du nie voll.

Weil der User endscheiden darf ob die Logfile automatisch gelöscht werden soll.

Jetzt muss ich nur noch raus ausrechnen wie alt die Datei ist.

Dateiname: 01022013.txt (Tag,Monat,Jahr)

Idee?

Grüße
speedy

speedy1982:
Jetzt muss ich nur noch raus ausrechnen wie alt die Datei ist.

Dateiname: 01022013.txt (Tag,Monat,Jahr)

Idee?

Solche Dateinamen sind suboptimal, weil falsch zusammengesetzt.

Besser:
Dateiname: 20130201.txt (Jahr,Monat,Tag)

Dann kannst Du nämlich durch einen einfachen Stringvergleich mit der Funktion "strcmp" feststellen, ob ein Dateiname einem größeren, kleineren oder gleichen Dateidatum entspricht.
Referenz strcmp: http://www.cplusplus.com/reference/cstring/strcmp/

Zeitliche und alphabetische Sortierung der Dateinamen sind nämlich in dem Fall identisch.

Mal angenommen, Du möchtest alle Dateien vor dem 12.05.2013 löschen, dann bildest Du Dir in einem char-Array den Dateinamen, der diesem Datum entspricht ("20130512.txt"), und liest nacheinander von der SD-Karte jeden Dateinamen ebenfalls in ein char-Array ein und vergleichst beide char-Arrays mit strcmp, dann weißt Du genau, ob diese Datei gelöscht werden muß (ist älter wenn strcmp-Ergebnis <0) oder nicht (strcmp-Ergebnis >=0) und den eigentlichen Vergleich übernimmt die Standardfunktion strcmp, ohne dass Du Code zum Vergleichen selbst schreiben musst.

Wenn Du stattdessen lieber "wilde Dateinamen" als Logdateinamen verwendest, wie von Dir genannt, kannst Du keine Standardfunktion verwenden, sondern mußt Deine Vergleichsfunktion selber schreiben.

Hi,

danke für deine Hilfe.

Ist alles sehr einleuchtend und wurde auch alles so umgeschrieben :o)

Wenn ich sagen wir alle Log Files die älter als 10 Tage sind löschen will hilft mir da strcmp nicht viel, oder?

Ich finde ja hier nur heraus ob <, >= usw. aber nicht ob die Datei älter als 10 Tage ist.

Glaube stehe gerade auf dem Schlauch :frowning:

Gruss
speedy

Aktuelles Datum nehmen, 10 Tage zurück rechnen und dann vergleichen.

Hi Udo,

genau da liegt mein Problem :-/ Wie mache ich das?

Gruss
speedy

Woher hast du überhaupt das Datum ?

Falls aus einer RTC : viele Bibliotheken liefern einiges Hilfsmaterial : z.B ein Datum als Sekunden seit 1.1.1970 ( oder 1.1.2000 ) darstellen und wieder zurück ...

864000 Sekunden sind 10 Tage ( meistens )

speedy1982:

[quote author=Udo Klein link=topic=171561.msg1276107#msg1276107 date=1371073431]
Aktuelles Datum nehmen, 10 Tage zurück rechnen und dann vergleichen.

Hi Udo,

genau da liegt mein Problem :-/ Wie mache ich das?
[/quote]

Ich heiße zwar nicht Udo, aber hier mal ein konkretes Codebeispiel, wie Du den Vergleichs-Dateinamen "vor x Tagen" bilden kannst, wenn Du die Time-Library verwendest:

#include <Time.h>

char fileName[13];

void setup() {
  Serial.begin(9600);
  // Mangels angeschlossener Uhr die Zeit testweise auf 13.06.2013 setzen
  setTime(0,0,0,13,6,2013);
  Serial.println("Dateiname von vor 10 Tagen bilden");
  time_t alteZeit=now()-(10*86400L); // 10 Tage a 86400 Sekunden von now() abziehen
  sprintf(fileName,"%04d%02d%02d.TXT",year(alteZeit),month(alteZeit),day(alteZeit));
  Serial.println(fileName);
  Serial.println("Dateiname von vor 150 Tagen bilden");
  alteZeit=now()-(150*86400L); // 150 Tage a 86400 Sekunden von now() abziehen
  sprintf(fileName,"%04d%02d%02d.TXT",year(alteZeit),month(alteZeit),day(alteZeit));
  Serial.println(fileName);
}

void loop() {
}

Je nach verwendeter Time-Library geht es bei Dir genauso oder anders, ganz abhängig von den Zeit- und Datumsfunktionen, die Du verwendest.