www.mikrocontroller.net

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

Autor: Daniel Platte (zerrome)
Datum: 15.05.2008 23:55

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: 16.05.2008 00:01

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 Platte (zerrome)
Datum: 16.05.2008 00:08

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: 16.05.2008 00:33

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 Platte (zerrome)
Datum: 16.05.2008 13:02

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: 16.05.2008 13:21

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 Platte (zerrome)
Datum: 16.05.2008 14:31

@ 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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net