Главная страница
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.047 c
2-1156679246
Randomix
2006-08-27 15:47
2006.09.17
Видео Чат


1-1155021622
Shaman_
2006-08-08 11:20
2006.09.17
Автоматический LOG программы


2-1157048565
Dmitry T
2006-08-31 22:22
2006.09.17
Всплывающий индикатор


15-1156269017
Nic
2006-08-22 21:50
2006.09.17
Отправление лесом


15-1156421072
Percent
2006-08-24 16:04
2006.09.17
TAPI 3.0