![]() |
|
Модераторы: Akina |
![]()
|
|
| -Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 8 Всего: 59 |
Кто подскажет, как наилучшим способом можно отследить изменение содержимого текстового файла?
Подробней: Есть "левый" процесс, который постоянно пишет в этот лог-файл, всегда добавляет туда строки. Скорость записи большая, за сутки - 500Мб(около 350Кб в секунду). Я пишу процесс, который следит за этим файлом, и динамически записывает данные из него в БД. На данный момент я делаю так: Так как файл всегда растет в размере и строки которые уже записаны, никогда не меняются, происходит только добавление, то я в цикле отслеживаю размер файла, и при изменении размера провожу добавление куска записей в БД, запоминаю позицию до которой я записал все в БД, и жду следующего изменения размера, и потом опять пишу в БД, начиная с запомненой позиции. Вот что мне не нравится: Проверку делаю так
Это криво! Красивей было бы например отслеживать какие-нибудь события(если они есть), которые возникают при изменении файла, или еще чнго нить... как нибудь красивей, оригинальней, алгоритм должен быть быстрым, и не ресурсоемким, так как это будет находиться на серваке Radius. Какие предложения? Рассмотрю все... спасибо. -------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 19 Всего: 99 |
Ну во первых конечно надо избавиться от цикла. Читай здесь:
http://forum.vingrad.ru/index.php?showtopic=30085 А ты можешь изменить что-нибудь в том "левом процессе"? -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| -Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 8 Всего: 59 |
А про Timer я уже думал, это как запасной вариант у меня. Спасибо! Я просто хотел сделать ваще по другому принципу, не проверять через определенный интервал изменился ли размер файла, а реагировать как нибудь только тогда, когда в файл что-нить записалось. Может хук на систему сделать, есть ли какое-нибудь событие которое сообщает об этом? Наверное есть, потому что как тогда виндовая утилита "Поиск файлов" узнает что гдето в папках произошли изменения? Ишеш файлы по маске, потом, когда поиск уже закончен(!)(но окно поиска открыто), если в любом месте на диске создать файл с именем удовлетворяющим критерию маски, то этот файл сразу же попадает в список найденых в окне поиска. Он же не переискивает заново на всем диске? Поисковик как-то узнает о том, что какой-то файл создали, т.е. изменили содержимое директории... Вот как это сделать? -------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
| cardinal |
|
||||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 19 Всего: 99 |
Это как ты понимаешь всегда лучше цикла...
Ладно... Тогда предожение следующее: Когда-то слышал, что в Винде крутиться постоянно несколько тысяц процессов. Плюс или минус один процесс разницы не далает. Почему бы не сделать thread который и будет заниматься только тем, что проверять изменился ли файл или нет? Думаю ничего другого придумать нельзя. А когда этот твой процесс обнаружит изменение файла он и пошлет тебе msg, которое ты примешь и сможешь обновить базу... Вот. Пока ничего другого в голову не приходит. -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||
|
|||||
| -Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 8 Всего: 59 |
Да, наверное так и придется сделать. Спасибо за предложение кардинал! Тебе плюс за то, что не покинул мой топик, а попытался предложить. Молодец! Если найду чего нибудь оригинальней, то выкину сюда. Но если появятся другие предложения, жду...
-------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
| Akina |
|
||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 34 Всего: 454 |
-Mikle-
У тебя еще не было случая когда очередная запись произошла в момент выполнения цикла проверки? Будет...
Впрочем это относится к ЛЮБОЙ реализации. Т.е. сразу длину файла - в переменную, и работаешь до следующего опроса ТОЛЬКО с этой переменной, игнорируя изменения файла в процессе обработки - они будут обработаны в следующем цикле. Это сообщение отредактировал(а) Akina - 16.10.2004, 13:14 -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
| -Mikle- |
|
||||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 8 Всего: 59 |
Ну вот, если долго мучаться, что нибудть получится
Функция WaitForFileChange вызывается в отдельной нити(потоке), разумеется для работы самих ф-ий Find...ChangeNotification это не обязательно, просто для конкретно моей реализации я запустил бесконечный цикл проверки в отдельном потоке. Таким образом я могу реагировать на событие изменение размера какого-то файла в папке. Замечу что событие не привязано к файлу, а ко всей директории, но это не проблема. Можно реализовать проверку на то изменился ли размер нужного мне файла, или нет. Если не изменился, ждать следущих изменений в папке. Константы
позволяют отслеживать другие события. Вот так то! -------------------- Если тебе плюют в спину, значит ты впереди... |
||||
|
|||||
![]()
|
| Правила форума "VB6" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | VB6 | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |