Форум по 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
Репутация: выкл
По умолчанию

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

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

Цитата:
Сообщение от Aristarh Dark
Если программа которая пишет лог "не сохраняет файл" до окончания времени работы, то винда буфер записи будет сбрасывать на диск "как Бог на душу положит".
Не совсем понял ваш посыл. я просто к тому что не работает в моем случае ReadDirectoryChangesW, что не приятно, а данные то я получаю.
Ответить с цитированием
  #8  
Старый 06.04.2016, 00:24
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 339
Версия Delphi: 10.4
Репутация: 429
Сообщение

Может быть, как вариант, это и вот это будет Вам полезно.
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #9  
Старый 06.04.2016, 11:05
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Kailon
Может быть, как вариант, это и вот это будет Вам полезно.
У меня в принципе так и реализован был мониторинг, но только я нашел сорс в виде компонента. Вот только 2 флага, которые бы мне помогли имеют примечание:
Цитата:
FILE_NOTIFY_CHANGE_SIZE - изменение размера файла.
FILE_NOTIFY_CHANGE_LAST_WRITE - изменение файла (это и предыдущее уведомление будет получено только в момент реальной записи файла на диск).
Ответить с цитированием
  #10  
Старый 07.04.2016, 14:51
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 339
Версия Delphi: 10.4
Репутация: 429
Сообщение

На каком этапе сейчас дело? Все работает или же все так же непонятно?
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #11  
Старый 07.04.2016, 16:31
Kraeved Kraeved вне форума
Прохожий
 
Регистрация: 21.03.2016
Сообщения: 8
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

А может с другим файлом попробовать, который не переписывается? Тоже стало интересно.
Ответить с цитированием
  #12  
Старый 07.04.2016, 20:14
nixon232 nixon232 вне форума
Активный
 
Регистрация: 26.01.2014
Сообщения: 282
Версия Delphi: delphi xe4
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Kailon
На каком этапе сейчас дело? Все работает или же все так же непонятно?
вчера выпал 2 раза и помогает только удаление файла. Я уже вывел на форму FSTR.count. В момент ошибки он перестает меняться. может 3-4 часа работать, а может через 20 мин багонуть.
Цитата:
А может с другим файлом попробовать, который не переписывается? Тоже стало интересно.
Не знаю не проверял. Другого такого нет, а имитировать пока нет времени.

Может из-за того, что я вызываю из JVthreadTimmer? Но вроде сборка достойная.

в догонку вопрос:

нужно узнать все окна определенного класса. Пока они есть, с ними работаем. Сейчас у меня в потоке зациклено
Код:
EnumWindows(@EnumWindowsProc, 0);


Если более красивый способ без перебора и хукков?
нужно поймать появление окна и уничтожение.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter