Seek
這篇筆記的起因是為了要 快速讀出 一個 700M 的純文字檔的最後一行,適用 Delphi7。
方法一:
以開純文字檔的方式,一次讀一行,循序讀到最後一行大約耗時 10 秒,還可接受。
procedure TForm1.BitBtn1Click(Sender: TObject);
var
myfile: TextFile;
s: string;
begin
memo1.clear;
memo1.Lines.Add('start: '+FormatDateTime('yyyy-mm-dd hh:nn:ss', now));
AssignFile(myfile, 'demo.txt');
Reset(myfile);
while not EOF(myfile) do
begin
ReadLn(myfile,s);
end;
memo1.Lines.Add(s);
CloseFile(myfile);
memo1.Lines.Add('stop: '+FormatDateTime('yyyy-mm-dd hh:nn:ss', now));
end;
方法二:
在確定特定檔案格式的前提開啟檔案,可透過 seek 指令,將檔案指標移到指定位置。
procedure TForm1.btnSeekClick(Sender: TObject);
var
myWord: char;
myFile : File of char; // 檔案為字元格式
iPos: Longint;
str: string;
begin
memo1.Clear;
// 以唯讀模式開啟檔案
AssignFile(myFile, 'demo.txt');
Reset(myFile);
// 取得檔案最末 50 個字元的文字指標位置
iPos := FileSize(myfile) - 50;
// 直接移動文字指標目的地
Seek(myFile, iPos);
// 一次讀一個字元, 並存入 str, 直至檔案末
while not EOF(myfile) do
begin
Read(myFile, myWord);
str := str + myWord;
Inc(iPos);
Seek(myFile, iPos);
end;
memo1.Lines.Add(str);
// 關閉檔案
CloseFile(myFile);
end;