wenn die gelesene blockgröße gleich der zu lesenden Recordgröße ist, sind die beschriebenen Methoden sehr, sehr langsam. Um viele Faktoren.
Der zu verwendente Lesepuffer sollte bei heutigen Festplatten schon sehr groß sein, 64 kb ist eine angenehme Größe.
Deshalb sollte man also mit einer großen Buffersize lesen und dann müsste man noch umständlich diesen Großen Block auf mehrere Deiner Records aufteilen. Bei diesem Verfahren sollte dann zusätzlich noch die zu lesende Buffersize ein Vielfaches der zu lesenden RecordSize sein, damit es keine Überschneidungen an den Blockgrenzen geben kann, in diesem Falle wird es dann nämlich noch komplizierter.
Das alles kann man sehr einfach haben und sich das nachdenken sparen, wenn man eine Kombination aus TFilestream und TReader verwendet. TReader kann das alles schon selbst.
also quasi sowas:
Delphi-Quellcode:
const
BufferSize = $10000; // 65536; 64 kb
function LoadFromFile(const aFileName : String) :Integer;
var
f : TFileStream;
r : TReader;
i : Integer;
myRecord : TMyRecord;
recSize : Integer;
begin
Result:=0;
recSize := SizeOf(TMyRecord);
f:=TFileStream.Create( aFilename , fmOpenRead or fmShareDenyWrite);
try
r:=TReader.Create(f ,BufferSize);
try
for i:=0 to (f.Size Div recSize) -1 do
r.Read(myRecord , recSize );
... // myRecord verarbeiten
Inc(Result);
end;
finally
r.Free;
end;
finally
f.Free;
end;
end;
siehe hier nochmal auch:
http://delphi.pjh2.de/articles/files/files.php
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.