Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
-1 / 0 / 0
Регистрация: 03.06.2011
Сообщений: 106

Оптимальный мониторинг изменения файла

26.09.2014, 17:30. Показов 2298. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Сторонняя программа записывает информацию в txt файл, как можно сделать, что как только Vb обнаруживает изменения в тхт , он читает информацию из файла и делает расчеты и записывает ее в другой тхт файл. Я могу сделать через таймер, что он будет все время открывать тхт файл, но ведь это лишняя нагрузка? Ведь каждые 100 млсек будет открываться файл
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.09.2014, 17:30
Ответы с готовыми решениями:

Оптимальный алгоритм изменения размерности массива
Я вот тут оптимизировал код, связанный с переопределением границ массива: Идея в том, что можно: Вариант 1) под циклом постоянно...

Мониторинг изменения файлов
Доброго времени суток! Заранее извиняюсь, если тема была уже затронута, но найти именно то, что нужно тут ее я не смог! Проблема в...

Мониторинг изменения значения
Создал приложение в windows form, вырисовывающее график функции. Хочу добиться того, чтобы при изменении значений переменных посредством...

18
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
26.09.2014, 19:36
Цитата Сообщение от smsgeorge Посмотреть сообщение
как только Vb обнаруживает изменения в тхт
Проверять время модификации файла функцией FileDateTime ?
1
-1 / 0 / 0
Регистрация: 03.06.2011
Сообщений: 106
26.09.2014, 19:51  [ТС]
спс
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
26.09.2014, 19:52
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Пример
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Option Explicit
 
Private Sub CheckDateTime()
    Dim d1 As Date: Static d2 As Date
    On Error GoTo m
    d1 = FileDateTime(App.Path & "\" & CStr(Text1.Text))  'дата модификации файла
    If d1 <> d2 Then Call MsgBox("Файл изменился.")
    d2 = d1
m:
End Sub
 
Private Sub Timer1_Timer()
    CheckDateTime
End Sub
Вложения
Тип файла: rar Пример.rar (4.2 Кб, 18 просмотров)
2
-1 / 0 / 0
Регистрация: 03.06.2011
Сообщений: 106
26.09.2014, 20:23  [ТС]
SoftIce, а как точно папку указать?
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
26.09.2014, 20:27
Цитата Сообщение от smsgeorge Посмотреть сообщение
SoftIce, а как точно папку указать?
Вместо App.Path укажите Ваш путь

Пример чтения-записи
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Option Explicit
 
Private Sub CheckDateTime()
    Dim d1 As Date, s As String
    Static d2 As Date
    s = App.Path & "\" & CStr(Text1.Text)
    On Error GoTo m
    d1 = FileDateTime(s)  'дата модификации файла
    If d1 <> d2 Then Call ReadFile(s)
    d2 = d1
m:
End Sub
 
Private Sub ReadFile(ByVal FileName As String)
    Dim s As String, FileName1 As String
    Dim ff As Integer:
    ff = FreeFile
    On Error Resume Next '
    Open FileName For Input As #ff
         s = Input(LOF(ff), ff) 'считываем файл
    Close #ff
    
    '''''
    Rem Тут рассчитываем
    MsgBox s '
    s = "Pезультат расчета"
    '''''''
    
    ff = FreeFile
    FileName1 = App.Path & "\" & "Output.txt"
    Open FileName1 For Output As #ff
         Print #ff, s 'пишем в файл
    Close #ff
End Sub
 
Private Sub Timer1_Timer()
    CheckDateTime
End Sub
1
-1 / 0 / 0
Регистрация: 03.06.2011
Сообщений: 106
26.09.2014, 21:24  [ТС]
SoftIce, Благодарю! Я такой код впервые вижу. .думаю. у меня открываются 3 файла , потом расчет, а потом сохранение переменных в 2 других файла .Прошу прощение, за навязчивость, но просто код такой впервые вижу.
Проверку можно делать по 1 из файлов, так как они одновременно изменяются.

Добавлено через 26 минут
SoftIce, подскажешь? как 3 файла открыть. и 2 сохранить. Просто конструкции не видел такие .
я обычно так делал.
Visual Basic
1
2
3
4
5
 Open "C:\KLM\lotro\ras\arcosfinal.txt" For Output As #2   
    Write #2, angleA                                         
       Write #2, angleB
          Write #2, angleC
       Close #2
Добавлено через 7 минут
SoftIce, можно так делать , как я делал или у твоего способа есть преимущества?
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
26.09.2014, 21:25
Можно проверять модификацию через ReadDirectoryChangesW.
2
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
26.09.2014, 21:27
Цитата Сообщение от smsgeorge Посмотреть сообщение
как 3 файла открыть. и 2 сохранить.
Не вижу проблемы.

Добавлено через 46 секунд
Цитата Сообщение от smsgeorge Посмотреть сообщение
у твоего способа есть преимущества?
Так способы одинаковые
1
-1 / 0 / 0
Регистрация: 03.06.2011
Сообщений: 106
26.09.2014, 21:35  [ТС]
SoftIce, Спасибо!
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
26.09.2014, 21:42
smsgeorge, распиши задачу, по-моему что-то ты мудришь.
0
26.09.2014, 21:47

Не по теме:

Цитата Сообщение от The trick Посмотреть сообщение
по-моему что-то ты мудришь.
Мне тоже так кажется :)

0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
26.09.2014, 23:02
Цитата Сообщение от smsgeorge Посмотреть сообщение
... как можно сделать, что как только Vb обнаруживает изменения в тхт , он...
Советую использовать механизм подписки на соответствующее системное событие. В данном случае, думается, больше всего подходит подписка синхронного типа.
Пример реализации с помощью WMI:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Sub Main()
Dim objWMI As Object, objCollection As Object, objEvent As Object
Dim strFile As String, intCount As Integer, blnFirstStart As Boolean
strFile = "D:\\test.txt"
If Len(Dir(Replace(strFile, "\\", "\"))) > 0 Then
    intCount = 0
    Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
    Set objCollection = objWMI.ExecNotificationQuery _
        ("SELECT * FROM __InstanceModificationEvent WITHIN 3 WHERE " _
        & "Targetinstance ISA 'CIM_LogicalFile' AND " _
        & "TargetInstance.Name='" & strFile & "'")
    'MsgBox "Начали наблюдение.", vbInformation
    blnFirstStart = True
    Do
        Set objEvent = objCollection.NextEvent
        If blnFirstStart Then
            blnFirstStart = False
        Else
            intCount = intCount + 1
            MsgBox "Событие " & CStr(intCount) & "." & vbNewLine & _
                    "Вместо этого оператора должен быть код обработки файла.", vbInformation
            If intCount > 2 Then Exit Do
        End If
    Loop
    Set objEvent = Nothing: Set objCollection = Nothing: Set objWMI = Nothing
    'MsgBox "Закончили наблюдение.", vbInformation
Else
    MsgBox "Файл не найден.", vbCritical
End If
End Sub
Примечание.
Программа требует, чтобы система уведомила её о наступлении события не позднее, чем через 3 секунды: WITHIN 3
3
-1 / 0 / 0
Регистрация: 03.06.2011
Сообщений: 106
28.09.2014, 00:40  [ТС]
Dmitrii, Все бы хорошо да бывает там время меньше секунды , за эту секунду вызывается файл, считает и закрывается. Ничего что так часто? )

Добавлено через 2 минуты
Так то программа хорошо работает, но считайте очень часто открывается, закрывается. она даже появится на экран не успевает) Там лишь открытие файла, открытие тхт, потом подсчет , запись тхт, закрытие.

Добавлено через 31 секунду
она считает аркосинус)
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
30.09.2014, 22:28
Цитата Сообщение от smsgeorge Посмотреть сообщение
... бывает там время меньше секунды...
Механизм подписки на событие предполагает, что приложение-подписчик получит от ОС все уведомления о наступлении искомого события, независимо от интервала времени между смежными событиями.
Однако если время обработки данных может превышать предполагаемый интервал между парой событий, то следует вместо синхронного использовать полусинхронный тип подписки, а также задать минимально возможное время предельной задержки оповещения (1 секунду).
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Sub Main()
Dim objWMI As Object, objCollection As Object, objEvent As Object
Dim strFile As String, intCount As Integer, blnFirstStart As Boolean
Const wbemFlagReturnImmediately = 16
Const wbemFlagForwardOnly = 32
strFile = "D:\\test.txt"
If Len(Dir(Replace(strFile, "\\", "\"))) > 0 Then
    intCount = 0
    Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
    Set objCollection = objWMI.ExecNotificationQuery _
        ("SELECT * FROM __InstanceModificationEvent WITHIN 1 WHERE " _
        & "Targetinstance ISA 'CIM_LogicalFile' AND TargetInstance.Name='" & strFile & "'", , _
        wbemFlagReturnImmediately + wbemFlagForwardOnly)
    'MsgBox "Начали наблюдение.", vbInformation
    blnFirstStart = True
    Do
        Set objEvent = objCollection.NextEvent
        If blnFirstStart Then
            blnFirstStart = False
        Else
            intCount = intCount + 1
            MsgBox "Событие " & CStr(intCount) & "." & vbNewLine & _
                    "Вместо этого оператора должен быть код обработки файла.", vbInformation
            If intCount > 2 Then Exit Do
        End If
    Loop
    Set objEvent = Nothing: Set objCollection = Nothing: Set objWMI = Nothing
    'MsgBox "Закончили наблюдение.", vbInformation
Else
    MsgBox "Файл не найден.", vbCritical
End If
End Sub

Кроме того, можно полностью или частично обрабатывать данные в другом приложении, которое либо будет вызываться из приложения-подписчика в качестве дочернего/независимого процесса, либо, будучи уже активным процессом, станет тем или иным способом получать от подписчика данные для обработки.
Впрочем, здесь уже возникают вопросы синхронизации процессов и выбора механизма передачи данных. Стоит ли "овчинка выделки", решать Вам.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
01.10.2014, 14:33
Dmitrii, полусинхронный - это асинхронный, или еще некий другой тип есть ?
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
01.10.2014, 15:38
Тут есть пример асинхронного ожидания в виде события.
0
2619 / 549 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
01.10.2014, 23:51
Цитата Сообщение от Dragokas Посмотреть сообщение
... полусинхронный - это асинхронный...
Нет, это модифицированный синхронный.

Существует три типа подписок.
1. Синхронный.
Реализуется с помощью метода ExecNotificationQuery объекта SWbemServices. Метод возвращает ссылку на объект SWbemEventSource, который соответствует искомому событию.
Алгоритмическая особенность: работа сценария-подписчика приостанавливается до момента полного формирования блока данных задействованным в обработке запроса WMI-провайдером, которому на это время и передаётся управление.
2. Полусинхронный.
Отличается от синхронного только алгоритмически: после запроса к WMI-провайдеру управление сразу возвращается в сценарий-подписчик (это условие определяется флагом wbemFlagReturnImmediately), данные от задействованного WMI-провайдера обрабатываются по мере поступления. В случае возврата данных о коллекции объектов поддерживается навигация только вперёд (это условие определяется флагом wbemFlagForwardOnly).
3. Асинхронный.
Реализуется с помощью метода ExecNotificationQueryAsync объекта SWbemServices. Метод возвращает ссылку на объект SWbemSink, который соответствует искомому событию.
Алгоритмические особенности: после запроса к WMI-провайдеру управление сразу возвращается в сценарий-подписчик, данные от задействованного WMI-провайдера обрабатываются по мере поступления; необходимо самостоятельно создавать процедуры-обработчики событий объекта SWbemSink.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
02.10.2014, 21:43
Dmitrii, Спасибо большое за разъяснения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.10.2014, 21:43
Помогаю со студенческими работами здесь

Оптимальный вариант проверки на изменения записей в базы данных
БД access, с базой работают энное кол-во клиентов. Я делаю проверку изменений в базе следующим образом: при добавлении, удалении,...

Мониторинг изменения цвета блока
Добрый день, есть сайт на котором имеется таблицы с 3 столбцами и 1000 строк, некоторые строки меняют цвет (class) на зеленый и обратно на...

Мониторинг каталога на предмет изменения содержимого
Нужно написать функция (или подпрограмму) которая мониторит каталог. Если какой либо файл в каталоге изменился (поменялся размер,...

Правильный мониторинг изменения содержимого div
Вообщем ситуация такая. Есть вот такой вот код: &lt;html&gt; &lt;head&gt; &lt;/head&gt; &lt;body&gt; &lt;div id='inp'...

Оптимальный размер файла подкачки
Мою голову посетил такой вопрос: какого размера должен быть файл подкачки? У меня два раздела: системный и игровой.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru