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!
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.