Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чтение последних строк файла [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]

В лог писать новые сообщения -- в начало.


Наверх

Титульная страница Поиск, карта сайта Написать письмо