Moin Akko,
das ist ja mal ein interessantes Problem
Probier' das hier mal aus:
Delphi-Quellcode:
function csCountLines(const AsFilepath : string) : Integer;
const
BUFSIZE = 65536;
var
fs : TFileStream;
sBuf : array [1..BUFSIZE] of char;
iLines : Integer;
iRead : integer;
i : Integer;
begin
fs := TFileStream.Create(AsFilepath,fmOpenRead);
try
iLines := 0;
iRead := fs.Read(sBuf,BUFSIZE);
while iRead = BUFSIZE do begin
for i := 1 to iRead do begin
Inc(iLines,Ord(sBuf[i]=#10));
end;
iRead := fs.Read(sBuf,BUFSIZE);
end;
for i := 1 to iRead do begin
Inc(iLines,Ord(sBuf[i]=#10));
end;
if (iRead > 0) and (sBuf[iRead] <> #10) then inc(iLines);
finally
fs.Free;
end;
Result := iLines;
end;
Auf dem gleichen Rechner mit der gleichen Datei getestet, ist die noch einmal schneller als Deine
Bei den offensichtlich sehr kurzen Zeilen, die Du da hast, ist das sequenzielle Durchsuchen des Buffers offensichtlich effizienter als die Sprünge mit PosEx.
@Philipp:
Da hast Du wohl recht. Inzwischen ist die Verwendung von TStringList wohl doch schneller als das rein zeilenweise Lesen.
Zuletzt hatte ich das unter NT 4 mit einem in D2 geschriebenen Programm getestet