Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
-1 / 0 / 0
Регистрация: 03.06.2011
Сообщений: 98
1

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

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

Здравствуйте! Сторонняя программа записывает информацию в txt файл, как можно сделать, что как только Vb обнаруживает изменения в тхт , он читает информацию из файла и делает расчеты и записывает ее в другой тхт файл. Я могу сделать через таймер, что он будет все время открывать тхт файл, но ведь это лишняя нагрузка? Ведь каждые 100 млсек будет открываться файл
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.09.2014, 17:30
Ответы с готовыми решениями:

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

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

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

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

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

Решение

Пример
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
2
Вложения
Тип файла: rar Пример.rar (4.2 Кб, 15 просмотров)
-1 / 0 / 0
Регистрация: 03.06.2011
Сообщений: 98
26.09.2014, 20:23  [ТС] 5
SoftIce, а как точно папку указать?
0
es geht mir gut
11208 / 4686 / 1177
Регистрация: 27.07.2011
Сообщений: 11,422
26.09.2014, 20:27 6
Цитата Сообщение от 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
Сообщений: 98
26.09.2014, 21:24  [ТС] 7
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
Модератор
8245 / 3075 / 816
Регистрация: 22.02.2013
Сообщений: 4,399
Записей в блоге: 78
26.09.2014, 21:25 8
Можно проверять модификацию через ReadDirectoryChangesW.
2
es geht mir gut
11208 / 4686 / 1177
Регистрация: 27.07.2011
Сообщений: 11,422
26.09.2014, 21:27 9
Цитата Сообщение от smsgeorge Посмотреть сообщение
как 3 файла открыть. и 2 сохранить.
Не вижу проблемы.

Добавлено через 46 секунд
Цитата Сообщение от smsgeorge Посмотреть сообщение
у твоего способа есть преимущества?
Так способы одинаковые
1
-1 / 0 / 0
Регистрация: 03.06.2011
Сообщений: 98
26.09.2014, 21:35  [ТС] 10
SoftIce, Спасибо!
0
Модератор
8245 / 3075 / 816
Регистрация: 22.02.2013
Сообщений: 4,399
Записей в блоге: 78
26.09.2014, 21:42 11
smsgeorge, распиши задачу, по-моему что-то ты мудришь.
0
SoftIce
26.09.2014, 21:47
  #12

Не по теме:

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

0
2616 / 546 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
26.09.2014, 23:02 13
Цитата Сообщение от 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
Сообщений: 98
28.09.2014, 00:40  [ТС] 14
Dmitrii, Все бы хорошо да бывает там время меньше секунды , за эту секунду вызывается файл, считает и закрывается. Ничего что так часто? )

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

Добавлено через 31 секунду
она считает аркосинус)
0
2616 / 546 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
30.09.2014, 22:28 15
Цитата Сообщение от 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
17550 / 7394 / 880
Регистрация: 25.12.2011
Сообщений: 11,193
Записей в блоге: 16
01.10.2014, 14:33 16
Dmitrii, полусинхронный - это асинхронный, или еще некий другой тип есть ?
0
Модератор
8245 / 3075 / 816
Регистрация: 22.02.2013
Сообщений: 4,399
Записей в блоге: 78
01.10.2014, 15:38 17
Тут есть пример асинхронного ожидания в виде события.
0
2616 / 546 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
01.10.2014, 23:51 18
Цитата Сообщение от Dragokas Посмотреть сообщение
... полусинхронный - это асинхронный...
Нет, это модифицированный синхронный.

Существует три типа подписок.
1. Синхронный.
Реализуется с помощью метода ExecNotificationQuery объекта SWbemServices. Метод возвращает ссылку на объект SWbemEventSource, который соответствует искомому событию.
Алгоритмическая особенность: работа сценария-подписчика приостанавливается до момента полного формирования блока данных задействованным в обработке запроса WMI-провайдером, которому на это время и передаётся управление.
2. Полусинхронный.
Отличается от синхронного только алгоритмически: после запроса к WMI-провайдеру управление сразу возвращается в сценарий-подписчик (это условие определяется флагом wbemFlagReturnImmediately), данные от задействованного WMI-провайдера обрабатываются по мере поступления. В случае возврата данных о коллекции объектов поддерживается навигация только вперёд (это условие определяется флагом wbemFlagForwardOnly).
3. Асинхронный.
Реализуется с помощью метода ExecNotificationQueryAsync объекта SWbemServices. Метод возвращает ссылку на объект SWbemSink, который соответствует искомому событию.
Алгоритмические особенности: после запроса к WMI-провайдеру управление сразу возвращается в сценарий-подписчик, данные от задействованного WMI-провайдера обрабатываются по мере поступления; необходимо самостоятельно создавать процедуры-обработчики событий объекта SWbemSink.
0
Эксперт WindowsАвтор FAQ
17550 / 7394 / 880
Регистрация: 25.12.2011
Сообщений: 11,193
Записей в блоге: 16
02.10.2014, 21:43 19
Dmitrii, Спасибо большое за разъяснения.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.10.2014, 21:43

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.