artem78 писал(а):xchgeaxeax писал(а):Попробуйте читать файл через TFileStream
Насколько я понимаю, он для двоичных, а не текстовых файлов предназначен. Как с его помощью читать файл построчно мне не понятно.
Так ясно же читайте "по байтово" и завешайте чение каждой строки по признаку eol (#13#10) для ускорения можно читать поблочно в буфер и парсить на предмет eol уже его.
Зы
Пример от
xchgeaxeax скорее всего рабочий но (ИМХО) немного переусложнен.
Зы Зы
Но проблему возможной блокировки файла все это все равно не решает.
Если другая программа тоже написана вами то можно попробовать открывать и закрывать файл для записи каждой строки,а в программе читающей лог добавить чтение каждой строки "с конца" отлеживая увеличение размера файла + пару тройку попыток открытия и чтения.
Добавлено спустя 1 час 5 минут 17 секунд:Алиса Яндексовна советует .
Можешь подсказать как читать последнюю строку в текстовом файле без перебора всего файла в Лазарус?
В Lazarus, вы можете использовать TStreamReader для чтения текстового файла построчно. Однако, у TStreamReader нет встроенной функции для чтения последней строки без перебора всего файла.
Один из способов сделать это - прочитать файл дважды: сначала прочитать все строки, чтобы узнать количество строк в файле, а затем прочитать последнюю строку, используя индекс этого количества минус единица. Это может быть не очень эффективно, если файл очень большой или если вам нужно читать последнюю строку часто.
Вот пример кода для чтения последней строки файла:
{ Объявляем переменные и инициализируем TFileStream }
var
Stream: TStreamReader;
LastLine: string;
I: Integer;
begin
{ Открываем файл }
Stream := TStreamReader.Create(TFileStream.Create('test.txt', fmOpenRead));
try
{ Считаем количество строк файла }
I := 0;
while Stream.ReadLine <> nil do
begin
Inc(I);
end;
{ Закрываем поток }
Stream.Close;
Хм! Разумеется нам при "индексировании" ( может пригодится при работе с действительно большим файлом) полезно получить не номер строки, а позицию ее начала в файле, но это уже совсем просто...
(С все-же "ИИ это такой ИИ" типичный "джин из сказки" . Спросишь - ответит... Но так что это скорее всего будет почти бесполезно!
![Wink :wink:](./images/smilies/icon_wink.gif)
...особенно доставил пассаж про "чтение дважды" (условие Stream.ReadLine <> nil тоже немного сомнительно (там строка на выходе... какой там к черту nil ? )... но что-то полезное в этой подсказки получить все-же можно
TStreamReader действительно существует...
https://lazarus-ccr.sourceforge.io/docs ... eader.html )