To read a text file backwards, you have to open it as a binary file, e.g. with FileOpen().
The following procedure ReadBack() reads one line backwards - up to the current position -.
So, initially, you need to position to the end of the file.
The usage is demonstrated in the routine FormCreate() below:
procedure Readback (const f: integer; var Line: String; var _bof: boolean);
const
MAXLINELENGTH = 256;
var
curr,
Before : Longint;
Buffer : array [0..MAXLINELENGTH] of char;
p : PChar;
begin
// scan backwards to the last CR-LF
curr := FileSeek (f, 0, 1);
Before := curr - MAXLINELENGTH;
if Before < 0 then
Before := 0;
FileSeek (f, Before, 0);
FileRead (f, Buffer, curr - Before);
Buffer[curr - Before] := #0;
p := StrRScan (Buffer, #10);
if p = Nil then
begin
Line := StrPas (Buffer);
FileSeek (f, 0, 0);
_bof := True
end
else
begin
Line := StrPas (p + 1);
FileSeek (f, Before + Longint (p) - Longint (@Buffer), 0);
_bof := False
end;
// this will also work with Unix files (#10 only, no #13)
if length (Line) > 0 then
if Line[length (Line)] = #13 then
begin
SetLength (Line, length (Line) - 1)
end
end;
procedure TForm1.FormCreate (Sender: TObject);
const
FileName = 'c:\delphi3\bin\unit1.pas';
var
f : integer;
Line : string;
BeginOfFile : boolean;
begin
f := FileOpen (FileName, 0);
// move to end of file!
FileSeek (f, 0, 2);
// read all lines, backwards
repeat
Readback (f, Line, BeginOfFile);
ListBox1.Items.Insert (0, Line);
until BeginOfFile;
FileClose (f);
end;