Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.17;
Скачать: CL | DM;

Вниз

Чтение последних строк файла   Найти похожие ветки 

 
Alexey 12   (2006-08-24 14:52) [0]

Нужно периодически просматривать лог-файл. Интерес представляют последние N строк в этом файле, т.к. предыдущие уже обработаны. Но читать с конца текстовый файл у меня не получается, поэтому приходится просматривать весь файл сначала. Это долго. Может кто знает как решить эту задачу?


 
Чапаев ©   (2006-08-24 14:53) [1]

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


 
Alexey 12   (2006-08-24 14:55) [2]

К сожалению лог-файл создает не моя программа


 
Сергей М. ©   (2006-08-24 14:57) [3]


> Alexey 12   (24.08.06 14:55) [2]


Зато твоя программа в этой ситуации обязана уметь запоминать тек.позицию в лог-файле, до которой обработка уже осуществлена.


 
Alexey 12   (2006-08-24 15:04) [4]

Да я могу запомнить, что последний раз читал строку N в этом файле. А как я смогу начать читать сразу со строки N+1 не прочитав первые N?


 
DesWind ©   (2006-08-24 15:11) [5]

Может стоит запоминать позицию, а не кол-во прочитаных строк?


 
MBo ©   (2006-08-24 15:14) [6]


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) [7]

Универсального решения нет.
Но частные решения вполне возможны.

Лог-файл фиксированного размера ?
Если да, то что происходит с его содержимым при достижении лимита ?


 
DesWind ©   (2006-08-24 15:15) [8]

А потом использовать Seek для возврата на позицию которуую запомнил.


 
Наиль ©   (2006-08-24 15:15) [9]

Информация к размышлению
Var
fs:TFileStream;
sts:TStringList;
begin
...
fs.Position:=...;
sts.LoadFromStream(fs);


 
StriderMan ©   (2006-08-24 15:15) [10]

TFileStream.Position


 
Anatoly Podgoretsky ©   (2006-08-24 21:07) [11]

Не использовать функций работы с текстовыми файлами!



Страницы: 1 вся ветка

Текущий архив: 2006.09.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.053 c
15-1156395719
Ega23
2006-08-24 09:01
2006.09.17
С Днём рождения! 24 августа


2-1156805812
7D7
2006-08-29 02:56
2006.09.17
Кодировка текста


15-1156756095
Михель
2006-08-28 13:08
2006.09.17
Подскажите софт, чтобы сделать коллаж!


2-1157006229
Интересующийся
2006-08-31 10:37
2006.09.17
Выбор значения в поле TDBGrid


15-1156310755
Rentgen
2006-08-23 09:25
2006.09.17
Кому не сложно, помогите узнать певицу или название песни!