Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.041 c
15-1156716586
Petr V. Abramov
2006-08-28 02:09
2006.09.17
33-й год жизни


15-1156409559
wal
2006-08-24 12:52
2006.09.17
Проблема с QuickReport


15-1156707585
Loginov Dmitry
2006-08-27 23:39
2006.09.17
Вопреки ругани форумчан


2-1156832936
evgenij_
2006-08-29 10:28
2006.09.17
С какой табл.работает ADOQuery


2-1156942703
Сергей1
2006-08-30 16:58
2006.09.17
Dbgrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский