Модераторы: diadiavova, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FileSystemWatcher, Наблюдение за изменениями в FSO 
:(
    Опции темы
ikorobko
Дата 21.6.2006, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 21.6.2006

Репутация: нет
Всего: нет



Используя FileSystemWatcher и таймер мне удалось наблюдать за одной из указанных папок. После того, как в течении указанного времени в папке не происходит никаких изменений - формируется отчет о проделанных изменениях и осуществляется его отправка по почте по указанному адресу. Однако, наблюдать за одним каталогом - хорошо, а за несколькими - необходимо! Подскажите как сделать? 
Я так понимаю, что надо программно создавать объекты. Как? - для меня загадка. Пробовал использовать многопоточность: здорово, но объект-то один! Помогите идеей или примером!
 
PM MAIL   Вверх
arilou
Дата 21.6.2006, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 7
Всего: 61



ikorobko, ты FileSystemWatcher ставишь на форму как компонент? Надо это делать программно, по одному FSW на папку. Или один - на корневую папку, тогда будешь мониторить всю активность.

Программно это делается примерно так (взято с MSDN):

Код

Public Shared Sub Main()
        Dim args() As String = System.Environment.GetCommandLineArgs()
        ' If a directory is not specified, exit the program.
        If args.Length <> 2 Then
            ' Display the proper way to call the program.
            Console.WriteLine("Usage: Watcher.exe (directory)")
            Return
        End If
        
        ' Create a new FileSystemWatcher and set its properties.
        Dim watcher As New FileSystemWatcher()
        watcher.Path = args(1)
        ' Watch for changes in LastAccess and LastWrite times, and
        ' the renaming of files or directories. 
        watcher.NotifyFilter = (NotifyFilters.LastAccess Or NotifyFilters.LastWrite Or NotifyFilters.FileName Or NotifyFilters.DirectoryName)
        ' Only watch text files.
        watcher.Filter = "*.txt"
        
        ' Add event handlers.
        AddHandler watcher.Changed, AddressOf OnChanged
        AddHandler watcher.Created, AddressOf OnChanged
        AddHandler watcher.Deleted, AddressOf OnChanged
        AddHandler watcher.Renamed, AddressOf OnRenamed
        
        ' Begin watching.
        watcher.EnableRaisingEvents = True
        
        ' Wait for the user to quit the program.
        Console.WriteLine("Press 'q' to quit the sample.")
        While Chr(Console.Read()) <> "q"c
        End While
    End Sub

  ' Define the event handlers.
    Private Shared Sub OnChanged(source As Object, e As FileSystemEventArgs)
        ' Specify what is done when a file is changed, created, or deleted.
        Console.WriteLine("File: " & e.FullPath & " " & e.ChangeType)
    End Sub    
    
    Private Shared Sub OnRenamed(source As Object, e As RenamedEventArgs)
        ' Specify what is done when a file is renamed.
        Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath)
    End Sub

  

Это сообщение отредактировал(а) arilou - 21.6.2006, 11:09


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
ikorobko
Дата 21.6.2006, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 21.6.2006

Репутация: нет
Всего: нет



Именно так я и делал, а как программно создать массив этих самых watcher'ов неясно))). Путь - как аргумент к командной строке - здорово, но в моей задаче не подходит. 
PM MAIL   Вверх
arilou
Дата 21.6.2006, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 7
Всего: 61



Цитата(ikorobko @  21.6.2006,  11:19 Найти цитируемый пост)
Именно так я и делал, а как программно создать массив этих самых watcher'ов неясно))). 

А зачем массив? Объекты не удалятся пока есть на них ссылки. Один из способов получить ссылку - взять параметр source в обработчике события и привести его к типу FileSystemWatcher.

Если уж совсем невмоготу smile 

Код

Dim list As New ArrayList

For I as Integer = 1 To 10
  Dim watcher As New FileSystemWatcher
  watcher.Path = "blablabla"

  list.Add(watcher)   
Next


 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
ikorobko
Дата 21.6.2006, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 21.6.2006

Репутация: нет
Всего: нет



Задача такая - отслеживать окончание изменений для каждой из папок по таймуту. Возникает вопрос - как? Тот пример, который привели вы - все результаты валятся в одну кучу, а мне их необходимо разделить! 
PM MAIL   Вверх
arilou
Дата 21.6.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 7
Всего: 61



Результаты разделяются тут:

Цитата(arilou @  21.6.2006,  11:08 Найти цитируемый пост)
 Private Shared Sub OnChanged(source As Object, e As FileSystemEventArgs)


Код

Private Shared Sub OnChanged(source As Object, e As FileSystemEventArgs)
  Dim realFsw as FileSystemWatcher = source

  ' и тут уже в зависимости от realFsw разделяешь так как тебе нужно
End Sub

 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
ikorobko
Дата 21.6.2006, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 21.6.2006

Репутация: нет
Всего: нет



А можно листинг целиком? и еще один вопрос? будет ли правильно, если я прикручу потом аналогичным образом к каждой папке по таймеру...? 
PM MAIL   Вверх
arilou
Дата 21.6.2006, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 7
Всего: 61



Цитата(ikorobko @  21.6.2006,  13:51 Найти цитируемый пост)
 можно листинг целиком?

Так а в чем проблема? Что именно не получается?

Цитата(ikorobko @  21.6.2006,  13:51 Найти цитируемый пост)
будет ли правильно, если я прикручу потом аналогичным образом к каждой папке по таймеру...?  

По идее, вполне прокатит. Если папок не много. 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
ikorobko
Дата 21.6.2006, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 21.6.2006

Репутация: нет
Всего: нет



Все свести воедино получилось и работать с несколькими каталогами получается, а вот разделить нет:
Тело функции и масси, элементы которого пути:
Код

 Public path_to_folder() As String
   
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        path_to_folder(0) = "c:\1"
        path_to_folder(1) = "c:\2"
        Dim list As New ArrayList

        For I As Integer = 0 To UBound(path_to_folder)
            Dim watcher As New System.IO.FileSystemWatcher
            watcher.Path = path_to_folder(I)
            watcher.NotifyFilter = IO.NotifyFilters.FileName Or IO.NotifyFilters.DirectoryName
            watcher.Filter = "*.*"
            AddHandler watcher.Changed, AddressOf OnChanged
            AddHandler watcher.Created, AddressOf OnChanged
            AddHandler watcher.Deleted, AddressOf OnChanged
            AddHandler watcher.Renamed, AddressOf OnRenamed
            watcher.EnableRaisingEvents = True
            list.Add(watcher)
        Next
    End Sub


Далее обработка событий. Приведу только одно- создание!
Код

 Private Shared Sub OnChanged(ByVal source As Object, ByVal e As System.IO.FileSystemEventArgs)
         MsgBox(realFsw.Path)
    End Sub


Понятное дело - такое работает. Как только я пытаюсь сделать анализатор, того что приехало, наступает БЕДА! Он не видит глобальных переменных, а также не видит объявленных функций:

Код

 Private Shared Sub OnChanged(ByVal source As Object, ByVal e As System.IO.FileSystemEventArgs)
        Dim realFsw As System.IO.FileSystemWatcher = source
        Dim Path = realFsw.Path
        doit(realFsw.Path)       
    End Sub

' где функция doit следующая
Public Function doit(ByVal PPP As String)
        For I As Integer = 0 To UBound(path_to_folder)

        Next
    End Function



или 
Код

Private Shared Sub OnChanged(ByVal source As Object, ByVal e As System.IO.FileSystemEventArgs)
        Dim realFsw As System.IO.FileSystemWatcher = source
        Dim Path = realFsw.Path
        For I As Integer = 0 To UBound(path_to_folder)
....
        Next
     
    End Sub


Он выдаеть ошиьку... подскжите как победить 
PM MAIL   Вверх
arilou
Дата 21.6.2006, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 7
Всего: 61



Код

Private Shared Sub OnChanged(ByVal source As Object, ByVal e As System.IO.FileSystemEventArgs)
        Dim realFsw As System.IO.FileSystemWatcher = source
        Dim Path = realFsw.Path
        For I As Integer = 0 To UBound(path_to_folder)
'  а что  ты тут собираешься делать?
        Next
    End Sub
 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
ikorobko
Дата 21.6.2006, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 21.6.2006

Репутация: нет
Всего: нет



Через перебор массива разделить потоки (признаком является путь к папке слеждения), затем создатьь таймер для проверки условия - если с этой папкой ничего не происходило (записи, удаления и т.д.), то отправляется письмо или создается файл отчета. Может быть я, конечно, кривое решение делоаю... но пока я только до этого додумался) 
PM MAIL   Вверх
arilou
Дата 21.6.2006, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 7
Всего: 61



Цитата(ikorobko @  21.6.2006,  15:10 Найти цитируемый пост)
признаком является путь к папке слеждения

Дык папка слежения у тебя уже есть в realFsw.Path 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
ikorobko
Дата 21.6.2006, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 21.6.2006

Репутация: нет
Всего: нет



так ведь мне же надо следить одновременно за несколькими папками и за активностью каждой из них следить! 
PM MAIL   Вверх
arilou
Дата 21.6.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 7
Всего: 61



ikorobko, в кажом случае, когда твои FSW'шки будут реагировать на события, параметр source будет принимать свое значение 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
ikorobko
Дата 21.6.2006, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 21.6.2006

Репутация: нет
Всего: нет



Все правильно, только по этим значения, ориентируясь по пути, мне надо составлять лог, накапливая его, например, в переменной для каждой папки, а затем ждать окончания активности для\ каждой папки! Вот как это реализовать я не знаю 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0531 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.