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


von Daniel R. (zerrome)


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

von Roland P. (pram)


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

von Daniel R. (zerrome)


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

von JensG (Gast)


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 ;-)

von Daniel R. (zerrome)


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?

von Sebastian (Gast)


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

von Daniel R. (zerrome)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.