![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение последних строк файла [D7, WinXP]
Alexey 12 © (2006-08-24 14:52:00)Нужно периодически просматривать лог-файл. Интерес представляют последние N строк в этом файле, т.к. предыдущие уже обработаны. Но читать с конца текстовый файл у меня не получается, поэтому приходится просматривать весь файл сначала. Это долго. Может кто знает как решить эту задачу?
Anatoly Podgoretsky (2006-08-24 21:07:00) [1]Не использовать функций работы с текстовыми файлами!
DesWind (2006-08-24 15:15:00) [2]А потом использовать Seek для возврата на позицию которуую запомнил.
Наиль (2006-08-24 15:15:00) [3]Информация к размышлению
Var
fs:TFileStream;
sts:TStringList;
begin
...
fs.Position:=...;
sts.LoadFromStream(fs);
StriderMan (2006-08-24 15:15:00) [4]TFileStream.Position
MBo (2006-08-24 15:14:00) [5]
procedure GetLastLines(const nstr: Integer; const FileName: string; Lines:
TStrings);
var
FileH: THandle;
MapH: THandle;
Size, Count: Integer;
PMap, PB: PByte;
begin
FileH := FileOpen(FileName, fmOpenRead);
if FileH <> INVALID_HANDLE_VALUE then begin
Size := GetFileSize(FileH, nil);
MapH := CreateFileMapping(FileH, nil, PAGE_READONLY, 0, Size, nil);
if MapH <> 0 then begin
PMap := MapViewOfFile(MapH, FILE_MAP_READ, 0, 0, Size);
if PMap <> nil then begin
PB := PMap;
inc(PB, Size);
if PB^ <> 10 then
Count := 1
else
Count := 0;
repeat
Dec(PB);
if PB^ = 10 then
Inc(Count);
until (Count > nstr) or (PB = PMAP);
if PB <> PMap then
Inc(PB);
Lines.Text := PChar(PB);
UnmapViewOfFile(PMap);
end;
CloseHandle(MapH);
end;
CloseHandle(FileH);
end;
end;
Сергей М. (2006-08-24 15:14:00) [6]Универсального решения нет.
Но частные решения вполне возможны.
Лог-файл фиксированного размера ?
Если да, то что происходит с его содержимым при достижении лимита ?
DesWind (2006-08-24 15:11:00) [7]Может стоит запоминать позицию, а не кол-во прочитаных строк?
Alexey 12 (2006-08-24 15:04:00) [8]Да я могу запомнить, что последний раз читал строку N в этом файле. А как я смогу начать читать сразу со строки N+1 не прочитав первые N?
Сергей М. (2006-08-24 14:57:00) [9]
> Alexey 12 (24.08.06 14:55) [2]
Зато твоя программа в этой ситуации обязанауметь запоминать тек.позицию в лог-файле, до которой обработка уже осуществлена.
Alexey 12 (2006-08-24 14:55:00) [10]К сожалению лог-файл создает не моя программа
Чапаев (2006-08-24 14:53:00) [11]В лог писать новые сообщения -- в начало.