Also, ich haben eine doppelt verkettete Liste
(jedes Element kennt seine Vorgänger und Nachfolger)
Die Elemente sind entsprechend ihrem ".Start"-Wert sortiert.
Nun möchte ich einen größeren (.Len) Eintrag C in C' und C2 aufteilen und dazwischen einen neuen Eintrag Result einfügen.
nur irgendwie geht da irgendwo was schief.
Denn wenn ich am Ende die Liste nochmal durchgeh und den .Next-Wert prüfe, dann stimmt der urplötzlich nicht mehr mit dem Vorgänger überein
hier der prinzipielle Aufbau:
Delphi-Quellcode:
type TRec = record
Prev, Next: PRec;
Start, Len: Integer;
end;
var Result, C, C2: PRec;
GetMem(Result, SizeOf(TRec));
GetMem(C2, SizeOf(TRec));
Result.Prev := C;
Result.Next := C2;
Result.Start := Start;
Result.Len := Len;
C2.Prev := Result;
C2.Next := C.Next;
C2.Start := Start + Len;
C2.Len := C.Len - (C2.Start - C.Start);
C.Next := Result;
C.Len := C.Len - Result.Len - C2.Len;
Ich kann da jedenfalls keinen Fehler entdecken
Dieses entspricht dem Code ab Zeile 403 in InsertFileToClusterList.
Die Prüfung wird am Ende des Einfügens in Zeile 274 (ClustersCount) vorgenommen.
Brauchte mal etwas Abwechslung und hab mir mal einen Defragmentierer vorgenommen
Das Ganze ließt aktuell nur das VolumeBitmap (Clusterbelegungsliste) aus, erstellt daraus
eine Liste, danach wird das Dateisystem ausgelesen (aktuell noch via FindFirst und Co.),
die Dateien in eine weitere Liste eingefügt
und zusätzlich die gefundenen Dateisegmente in diese Clusterbelegungsliste eingefügt.
Ja und beim letzen Punkt geht was schief.
Wenn ich den entsprechenden Code ausbau (den kleinen Exitcode Zeile 403 aktivier), dann gibt's keine Probleme, also sollte es doch an dieser Stelle hängen?
Also, wie gesagt, für mich sieht das Richtig aus und ich hab keine Ahnung mehr, was los ist
PS: wie sieht es denn eigentlich aus ... etwa 1 MB RAM je 10.000 Dateien/Ordner,
für eine komplette Kopie des Dateisystems und des VolumeBitmaps, ist doch OK?
[add]
hab grad mal je vor und nach diesen Code eine Prüfschleife reingemacht und diese schlägt danach sofort zu ... also es liegt definitiv an diesem Codeabschnitt
[edit]
Anhang entfernt