Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.04.2016, 13:46
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию TFileStream & TStringList

Не уверен, что угадал с веткой. Задача: прочитать с конца файл, найти данные - уйти. Все хорошо, но в какой то момент файл читается не с конца. такое ощущение, что достигнут максимум fstr.count.
Код:
fs:=TFileStream.Create(fn,fmShareDenyNone);
fs.Position:=0;
fstr:=TStringList.Create;



Fstr.LoadFromStream(fs,TEncoding.Default);
fs.Free;
//ShowMessage(IntToStr(fstr.Count));
   for I := fstr.Count-1 downto 0 do
   begin
     Line:=fstr[i];
Сам файл не большой вроде. Как лучше получить Line[i] в таком случае?
В момент ошибки Fstr.count= 7115 всего-то. сам файл в это время 140к строк
Ответить с цитированием
  #2  
Старый 04.04.2016, 23:45
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 339
Версия Delphi: 10.4
Репутация: 429
По умолчанию

Почему считать файл с конца нужно? Файл постоянно дописывается другим приложением? Или же файл переоткрывается на чтение при его изменении?
А это как?
Цитата:
Все хорошо, но в какой то момент файл читается не с конца
Т.е. то читается, то не читается?
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #3  
Старый 05.04.2016, 12:47
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Потому что файл - это лог с однотипными данными. Его пишет сторонняя программа. меня интересуют последние данные (конец файла). видимых ошибок доступа нет. Просто в какой-то момент возвращается не тот каунтер. И что с файлом не делай, каунтер как замерз. (всегда разный) Вчера кстати работало стабильно, никаких изменений вроде не вносил, чудо.

Если есть другой способ читать с конца, буду рад увидеть

Последний раз редактировалось nixon232, 05.04.2016 в 12:51.
Ответить с цитированием
  #4  
Старый 05.04.2016, 14:30
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 339
Версия Delphi: 10.4
Репутация: 429
Сообщение

Размышления:
  1. А если предварительно скопировать файл в другое место и работать уже с копией?
  2. А если открыть файл, узнать кол-во строк на момент открытия, прочитать их и закрыть файл. В последующем открыть файл, а чтение производить уже с запомненной строки.
Цитата:
Вчера кстати работало стабильно, никаких изменений вроде не вносил, чудо.
Забавно...
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.

Последний раз редактировалось Kailon, 05.04.2016 в 14:38.
Ответить с цитированием
  #5  
Старый 05.04.2016, 17:03
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

1. Разве это не то, что я делаю? fstr.loadfromstream(fs) и fs.free
2) Изначально я так и планировал, но судя по всему программа сохраняет файл только завершению работы, из-за этого не срабатывает флаг изменения файла Приходиться по-кривому в потоке с ключем fmShareDenyNone. Можно конечно переписать чтобы читал не с нуля, но если каунтер вернет не то значение, мы вернемся откуда и пришли

Последний раз редактировалось nixon232, 05.04.2016 в 17:07.
Ответить с цитированием
  #6  
Старый 05.04.2016, 18:28
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Если программа которая пишет лог "не сохраняет файл" до окончания времени работы, то винда буфер записи будет сбрасывать на диск "как Бог на душу положит".
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:20.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter