Форум: "Начинающим";
Текущий архив: 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