www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik FAT16 avr ordner wie rekrusiv löschen ?


Autor: Daniel R. (zerrome)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nabend,

hab da eine spezielle frage...

Bin grade fat16 für einen atmega168 am programmieren, bis jetzt ohne 
schreib unterstützung. flash brauch ich momentan so 4100 bytes,ram 700 
bytes. Ist schon recht weit vortgeschritten, ffopen, ffclose, ffread, 
ffmkdir, ffcd, ffrm_file, ffseek...

mein problem jetzt, ich will ordner löschen können, da muss ich aber 
rekrusiv löschen und alle cluster-chains, hat da mal jemand ne idee?


grüße daniel

Autor: Roland Praml (pram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kenn mich zwar mit FAT nicht sooo toll aus, aber ich vermute mal, 
dass du Speicherprobleme hast...

Jetzt könntest du was ziemlich pöses machen:
in einem oder mehreren Clustern die sowieso gelöscht werden könntest du 
dir die zu löschenden Clusternummern abspeichern. somit hast pro 
geopferten Cluster 512 Byte mehr Swap-Ram ;-)

Gruß
Roland

Autor: Daniel R. (zerrome)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm,

ram probleme hab ich eigentlich nicht , hat ja 1024 bytes ram der m168, 
da is noch was luft nach oben.
Das problem ist eher, dass wenn ich z.b 100000 verschachtelte ordner 
habe muss ich ja in den untersten und von da an aufsteigend alles 
löschen quasi, mir fällt da nur nicht ein wie genau...
und sowas zwischenzuspeichern ist auch nicht so super

grüße daniel

Autor: JensG (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ein einfacher, aber höchst ineffizienter Weg wäre, nachdem du eine 
Ordnerebene gelöscht hast, alles wieder zu verlassen, und wieder von 
vorn ein- und absteigen. Evtl. kannste Dir auch nur die letzten 
durchlaufenen Ordnerebenen merken, um wieder teilweise zurückgehen zu 
können, um in den nächsten Odner zu gehen (sozusagen nur partiell 
rekursiv), um das wiederholte Neueinsteigen zu reduzieren.

Ansonsten ungefähr so, wie  Roland Praml (pram) es vorgeschlagen hat.

Anfangs wollte ich vorschlagen, einfach nur den Eintrag für den ersten 
Ordner zu löschen, womit ja die Referenzen zu den anderen Ordnern nicht 
mehr da sind. Aber ich glaube, die Cluster müssen wohl alle irgendwie 
als leer markiert werden, um wiederverwendet werden zu können - oder? 
(ist schon lange her, als ich mich mal mit der FAT beschäftigt hatte ;-)

Autor: Daniel R. (zerrome)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

@ JensG

ja, so hatte ich das zuerst auch,
nur die cluster des obersten ordners gelöscht. Dann stehen aber in der 
fat immer noch die einträge der dateien und unterordner, sind dann also 
belegt.

Werd jetzt mal versuchen über die "." und ".." einträge der ordner was 
zu machen.

was nicht geht wäre:

1. sequentiell die cluster einträge(32byte)durchgehen und die 
cluster-chain der dateien löschen.

2.wenn man an nen ordner kommt, in diesen wechseln und den cluster des 
".." eintrags merken (damit man zurück kommt)und dann wieder zu 1.

geht nicht, weil man so halt immer die ".." einträge puffern müsste also 
2 byte pro unterordner, wenn die verschachtelt sind....

die fat "rückwärts" lesen geht auch nicht oder!?!

den weg eine neue cluster-chain zu machen quasi eine wegbeschreibung 
durch die ordner die zu lö schen sind,find ich nicht gut, ich will 
löschen, nicht noch mehr schreiben.
wie machen das denn die großen?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermute rekursiv ;-)

Den aktuellen Ordner durchsuchen, ob er selbst einen Ordner gibt. Wenn 
ja, ruft sich die Löschroutine für diesen Ordner erneut auf.
Nach der Rückkehr aus der zweiten Ebene wird weiter nach Ordnern im 
eigenen Ordner gesucht. Gibt es keinen Mehr, werden alle Dateien 
gelöscht, danach der eigene Ordner und dann die Funktion beenden, sodass 
die nächsthöre Ebene ausgeführt wird.

Für den µC wegen dem Speicherbedarf nur bedingt geeignet, aber das weißt 
du ja eh schon.

Was spricht gegen die ..-Einträge? Du musst dir ja nicht alle merken, 
sondern nur den, von dem Ordner, den du gerade löscht.
Wenn du im letzen Ordner bist, merkst du dir den ..-Eintrag, löscht alle 
Dateien und anschließend den Ordner. Über den gemerkten ..-Entrag gehst 
du dann "eine Ebene höher", wo du sowieso noch den Ordner-Eintrag 
löschen musst.

Aber egal wie viele Ebenen es Gibt: Du musst dir immer nur merken, 
welches der höchste zu löschende Ordner ist und eben den ..-Eintrag des 
Ordners, der gerade gelöscht wird.

Sebastian

Autor: Daniel R. (zerrome)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Sebastian

Äh ja,
da is was dran,
stand etwas auf dem schlauch...
Es geht ja doch so etwas wie fat rückwärts lesen, über die ..-einträge.
Da steht ja der startcluster vom ordner davor und der eigene drin :)
Wenn man sich die, bei jedem wechsel des ordners merkt, kann man in den 
untersten ordner und von da auch zurück.

super, danke

grüße daniel

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.