Zitat von
himitsu:
@akko5: ein größerer Speicherblock könnte nicht schaden, damit verringern sich die Lesezugriffe und das ganze ist auch etwas optimaler in Bezug auf die WindowsFileCache/Dateiverwaltung.
BUFFER_SIZE = 65536; // 64 KB
Ja Danke. Hab auch noch einen kleinen Fehler gefunden, dass die letzte Zeile nicht immer gezählt wurde.
So sollte die Funktion perfekt sein:
Delphi-Quellcode:
function PosCount(const SubStr, S: String): Integer;
var
iPos: Integer;
begin
Result := 0;
iPos := 0;
repeat
iPos := PosEx(SubStr, S, Succ(iPos));
if iPos > 0 then Inc(Result);
until iPos = 0;
end;
function CountLines(const sFile: String): Integer;
const
BUFFER_SIZE = 65536;
var
fInput: File;
cBuffer: Array[1..BUFFER_SIZE] of Char;
iRead: Integer;
sBuffer: String;
begin
Result := 0;
AssignFile(fInput, sFile);
try
ReSet(fInput, 1);
try
while not EOF(fInput) do
begin
BlockRead(fInput, cBuffer, BUFFER_SIZE, iRead);
sBuffer := Copy(cBuffer, 1, iRead);
Inc(Result, PosCount(#10, sBuffer));
end;
if sBuffer[Length(sBuffer)] <> #10 then Inc(Result);
finally
CloseFile(fInput);
end;
except
//Result := -1;
end;
end;
Für eine ~100 MB Textdatei (9105111 Zeilen) brauchte die Funktion 296 ms.
MfG