Forum: Mikrocontroller und Digitale Elektronik FAT32 Cluster verketten Verständnisfrage!


von Erwin L. (stm32fan)


Lesenswert?

Hallo!
Ich versuche gerade die FAT zu verstehen und schreibe dabei meine 
eigenen Funktionen. Lesen und Datei erstellen verstehe ich wie es 
funktioniert.
Aber, wie ist es wenn ich eine Datei erweitern möchte?

z.B.
Datei1.txt belegt den Cluster 3
Datei2.txt belegt Cluster 4,5,6,7
Datei3.txt belegt Cluster 8,9,10,11

Wenn ich der Datei einen zusätzlichen Cluster hinzufügen möchte.

Dann muss ich ja in der Directory die Länge aktualisieren.
und in der FAT:

z.B:
      1         2          3     Datei1.txt
0x0FFFFFF8 0x7FFFFFFF 0x0FFFFFFF 0x0FFFFFFF  <---------

      5         6          7     Datei2.txt
0x00000005 0x00000006 0x00000007 0x0FFFFFFF

      9         10        11     Datei3.txt
0x00000009 0x0000000A 0x0000000B 0x0FFFFFFF

      12         13        14     Freie Cluster
0x00000000 0x00000000 0x00000000 0x00000000  <----------


dann so abändern:

      1         2          3     Datei1.txt
0x0FFFFFF8 0x7FFFFFFF 0x0FFFFFFF 0x00000000  <---------- als frei
                                                         markieren
      5         6          7     Datei2.txt
0x00000005 0x00000006 0x00000007 0x0FFFFFFF

      9         10        11     Datei3.txt
0x00000009 0x0000000A 0x0000000B 0x0FFFFFFF

      Datei1.txt        14     Freie Cluster
0x00000003 0x0000000C 0x0FFFFFFF 0x00000000  <---------- neue anlegen

Aber so fuktioniert es nicht. Verstehe ich das falsch? Die Cluster 
müssen einfach der Reihe nach stehen.

Danke schonmal im Vorraus!

von Edi R. (edi_r)


Lesenswert?

Die Nummerierung der Cluster in der FAT beginnt ja mit 0, und der Inhalt 
(wenn nicht als "Ende" oder "unbelegt" markiert) zeigt die Nummer des 
nächsten Clusters. Deshalb spielt die Reihenfolge der Cluster keine 
Rolle. (In wirklichkeit gelegentlich schon, aber nur wegen der 
Geschwindigkeit, mit der die Daten gelesen werden können.)

Um bei Deinem Beispiel zu bleiben, müsste es so aussehen:

      0         1          2     Datei1.txt
0x0FFFFFF8 0x7FFFFFFF 0x0FFFFFFF 0x0FFFFFFF  <---------

      4         5          6     Datei2.txt
0x00000005 0x00000006 0x00000007 0x0FFFFFFF

      8         9         10     Datei3.txt
0x00000009 0x0000000A 0x0000000B 0x0FFFFFFF

     12        13         14     Freie Cluster
0x00000000 0x00000000 0x00000000 0x00000000  <----------

Z. B. Cluster Nr. 5 hat als Folgecluster also Nr. 6.

Wenn Du Datei1.txt um einen Cluster erweitern willst, könnte das so 
aussehen:

      0         1          2     Datei1.txt
0x0FFFFFF8 0x7FFFFFFF 0x0FFFFFFF 0x0000000C  <---------

      4         5          6     Datei2.txt
0x00000005 0x00000006 0x00000007 0x0FFFFFFF

      8         9         10     Datei3.txt
0x00000009 0x0000000A 0x0000000B 0x0FFFFFFF

     12        13         14     Freie Cluster
0x0FFFFFFF 0x00000000 0x00000000 0x00000000  <----------

Datei1.txt belegt dann Cluster 3 und Cluster 12.

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Der erste Cluster steht im Verzeichnis. Besteht die Datei aus nur einem 
Cluster enthält der entsprechende FAT-Eintrag eine Ende-Markierung, 
ansonsten den Verweis auf den nächsten belegten Cluster. Wenn deine 
Datei erst nur Cluster 03 belegt, steht also Cluster 03 im Verzeichnis 
und der FAT-Eintrag enthält die Ende-Markierung (0xFFFFFFF8) (8-F geht 
als LSB). Willst du die Datei erweitern ohne sie neu anzulegen, müsstest 
du in Cluster 03 den Eintrag auf Cluster 0C einfügen und bei Cluster 0C 
die Endemarkierung.

Du hast irgendwie Cluster 03, auf den evtl. das Verzeichnis noch 
verweist, als frei markiert, verweist von Cluster 0C auf diesen freien 
Cluster und von Cluster 0D auf Cluster 0C und die Endemarkierung kommt 
in Cluster 0D.

Korrekt müsste sein:
      1         2          3     Datei1.txt
0x0FFFFFF8 0x7FFFFFFF 0x0FFFFFFF 0x0000000C

      5         6          7     Datei2.txt
0x00000005 0x00000006 0x00000007 0x0FFFFFFF

      9         10        11     Datei3.txt
0x00000009 0x0000000A 0x0000000B 0x0FFFFFFF

      Datei1.txt        14     Freie Cluster
0xFFFFFFF8 0x00000000 0x00000000 0x00000000

Die Cluster können übrigens wild verstreut sein, nennt sich dann 
Fragmentierung ;-)

Vielleicht hilft dir diese Seite:
http://members.inode.at/anton.zechner/az/FatFormat.htm

von Erwin L. (stm32fan)


Lesenswert?

Danke für eure Antworten. Jetzt verstehe ich es. So wie ich es 
geschrieben habe, hätte diese Formel nichts gebracht.

FirstSectorofCluster = ((N – 2) * BPB_SecPerClus) + FirstDataSector;

Hätte ich dann, den Cluster nicht gefunden in meinem Array. Wenn ich 
denn Cluster 3 auf die Position z.B. 432 verschoben hätte.

Jetzt läufts! Vielen Dank!

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.