|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Постоянное обновление txt файла как в FAR
Написал программу для анализа файла txt, в файл постоянно пишется инфа другой программой.
Мне постоянно приходится в ручную обновлять файл для последующего анализа. Как то можно сделать как в FAR ? Вот кусок процедуры Код:
procedure TForm1.Button1Click(Sender: TObject); var Fs : TFileStream; Od : TOpenDialog; begin combobox1.Enabled:=true; button3.Enabled:=true; Combobox2.Enabled:=true; button4.Enabled:=true; Od := OpenDialog1; if Od.InitialDir = '' then Od.InitialDir := ExtractFilePath( ParamStr(0) ); if not Od.Execute then Exit; if not FileExists(Od.FileName) then begin MessageBox(0, 'Ôàéë ñ çàäàííûì èìåíåì íå íàéäåí. Äåéñòâèå îòìåíåíî.' ,'Îòìåíà!', MB_OK + MB_ICONWARNING + MB_APPLMODAL); Exit; end; Fs := TFileStream.Create(Od.FileName, fmOpenRead + fmShareDenyNone); try Memo1.Lines.LoadFromStream(Fs); Caption := '' + ExtractFilename(opendialog1.FileName); StatusBar1.Visible := True; StatusBar1.Panels[0].Text := OpenDialog1.FileName; statusbar1.Panels[1].Text:= 'Ñòðîê:'+IntToStr(Memo1.Lines.Count); finally FreeAndNil(Fs); end; end; |
#2
|
|||
|
|||
можно просто перечитывать файл по таймеру. можно использовать спец. компоненты (не помню точно название, с Д7 есть в Samples, что-то там с Notify), там будет "подниматься" эвент при изменении отслеживаемого файла (можно просто через API сделать тоже самое, но через компоненты просто удобнее).
|
#3
|
|||
|
|||
Да, тоже нужно мне как раз.
Я подумал про таймер. Но постоянно перечитывать файл в 50 Mb , это не правильно. Вот бы дочитывать , что не хватает в уже открытом. |
#4
|
||||
|
||||
Может попробовать читать при изменении времени последнего обращения к файлу?
jmp $ ; Happy End! The Cake Is A Lie. |
#5
|
|||
|
|||
В мой txt идёт постоянная запись (ежесекундно) 24 часа, а потом создаётся новый файл и пишется обратно 24 часа и так далее.
Это лог файл оборудования , которое работает круглосуточно . |
#6
|
||||
|
||||
Ну если затачиваться на то, что в файл только дописывается, но уже записанное не изменяется, то просто сохранять текущую позицию в файле и по таймеру дочитывать с этой позиции до конца файла и обновлять позицию.
jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
yuoras (28.05.2015)
|
#7
|
||||
|
||||
Надо у файловой системы спрашивать последнее время изменения, если оно отличается от значения при предыдущем чтении, то перечитывать файло.
Ну не знаю, можно еще на какое-нибудь системное событие повесить обработчик. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
yuoras (28.05.2015)
|
#8
|
|||
|
|||
Цитата:
Можно пример , как дочитывать до конца файл и обновить позицию?. Не очень хорошо разбираюсь в Delphi , пока учусь |
#9
|
||||
|
||||
Ну тогда размер сверять, если файл ежесекундно раздувается.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#10
|
|||
|
|||
Ну сделай "дочитку". Т.е. тебе надо использовать не Memo1.Lines.LoadFromFile, а свой механизм чтения на основе файлового потока с запоминанием позиции. Алгоритм примерно такой. Читаем файл через поток, запоминаем размер (последнюю считанную позицию). Все считанное добавляем в Memo. При изменении файла опять открываем файл потоком сдвигаем указатель на запомненную позицию и дочитываем до конца файла. Новую позицию запоминаем, а считанные данные добавляем в Memo.
В принципе, можно просто написать свой компонент для этого. Наверное, писать с использованием потока, что бы работал и в MacOS/iOS/Andriod (там только путь к файлу по другому будет выглядеть). |