Обновление данных в файле...

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

Всем привет! Такую вот задачу себе поставил и пытаюсь ее решить. Есть каталог с логом от программы. Этот лог время от времени очищается. Нужно написать прогу которая бы брала из лога все содержимое и копировала в другой каталог в другой файл, чтоб этот файл шел с накоплением данных. Хочу чтоб она с равным интервалом проверяла содержимое этого лога.

Мысль такая - берем компонент Мемо, в него загружаем по сигналу таймера содержимое лога, сохраняем в файл темп.тхт.

Проблема в том, как узнать что в логе появились новые данные, и не повторять сохранение старых, при том что лог в неопределенное время обнуляется???
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

время файла и дату модификации файла можно проверить.
Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

airyashov писал(а):время файла и дату модификации файла можно проверить.
Я конечно об этом думал, но как быть в такой ситуации - В лог добавилась информация, мы ее всю взяли и поместили в другой файл, прошло время, лог обновился, добавилась новая информация, как нам взять только то что добавилось? Прошло еще время, лог обнулился. Прошло еще время, в лог добавилась новая информация. Вот как эти шаги контролировать, чтоб не повторять содержимое лога в нашем файле и не обнулить наш файл случайно?
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

В реестре или ини-файле запоминать размер лога в момент последней синхронизации
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Хыиуду писал(а):В реестре или ини-файле запоминать размер лога в момент последней синхронизации
А если с последней синхроницации уже успело а) почиститься б) добавиться, причм так зловредно совпало, что размер не изменился?
Да даже если и изменился, неизвестно ведь, с какого места надо сохранить лог.

У меня такая мысль. Лог писать более-менее структурированно: каждая отдельная запись занимает однй строку текста. В начале строки пишется дата + время, когда делается эта запись. Причем, дата + время пишется в определенном фиксированном формате (например:
31.03.2008, 17:23:28 : <текст>
)
При бэкапе где-то фиксировать последнюю скопированную запись лога.
При новом бэкапе читать временный лог с начала построчно, в поисках первой строки, которая по дате не меньше "зафиксированной" в прошлый раз строки.
Если есть совпадающие даты, то сравнивать сам <текст>, и начать копирование со строки, после той, что совпадает с "зафиксированной".
Dr_Grizzly
Сообщения: 407
Зарегистрирован: 13 сен 2004, 12:05
Откуда: Курган
Контактная информация:

м-м-м да, мысль хорошая! Надо ка попробовать, я ща оценил структуру лога, там есть к чему прицепиться, уникальное значение при каждой записи.... Надеюсь что уникальное ;)

Каким методом можно быстро искать запись в Memo?
Чем проще - тем оригинальней, а значит гениально, т.к. все гениальное - просто! ;) Да! Кстати! Ctrl+V реально вставляет!!! ХDD
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

не зная структуры лога трудно что-то посоветовать, обычно в лог пишутся дата и время сообщения
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Dr_Grizzly писал(а): Каким методом можно быстро искать запись в Memo?
С помощью метода Memo1.Lines.IndexOf
[syntax='Delphi']
Idx:=Memo1.Lines.IndexOf('stroka');
[/syntax]
Ни что так не ограничивает фантазию программиста, как компилятор...
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

А можно сам лог делать ини-файлом и работать с ним соответственно. Ну, это уже мои извраты
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

Dr_Grizzly, да, а изменить программу, которая пишет в лог - это доступно?
Тогда куча более толковых (надёжных решений). Например, самое простое - программа, которая пишет в лог, не очищает его, а переименовывает старый лог и создаёт новый. Тогда можно смело всё переносить из переименованного лога в общую базу...
Вот только боюсь, что эта программа (которая в лог пишет) - это чужой "чёрный ящик" и изменить её поведение нельзя... иначе эта тема бы и не возникла ;-(

и ещё, проверять изменения лог файла лучше не по таймеру, а привязаться к событию ChangeNotification - смотри FindFirstChangeNotification или вот здесь цитата из DelphiWorld - Мониторинг каталогов - с другого форума
Ответить