Монитор файловой системы
К числу принципиальных новшеств, отличающих VB .NET от предыдущих версий VB, относится и возможность сделать на сервере то, что в VB давно делалось для клиентов. Речь идет об инкапсуляции общей функциональности в элементах и многократном использовании кода. В завершение этой главы мы покажем, как использовать класс FileSystemMonitor для написания программы, которая отслеживает изменения в заданном каталоге и сигнализирует о них при помощи событий.
Программа может следить за каталогом или набором файлов, соответствующих заданному фильтру. Элемент Fil eSystemMoni tor даже может произвести рекурсивный перебор всех подкаталогов заданного каталога. Инициируемые события перечислены в табл. 9.13.
Таблица 9.13. События монитора файловой системы
Событие |
Описание | ||||
Changed |
Изменения в размере, системных атрибутах, времени последней записи, времени последнего обращения или привилегиях безопасности для подкаталога или файла | ||||
Created |
Создание подкаталога или файла | ||||
Deleted |
Удаление подкаталога или файла | ||||
Renamed |
Переименование подкаталога или файла | ||||
Впрочем, компонент FileSystemMonitor не всесилен — в частности, он не позволяет отслеживать изменения в самом каталоге. Если кто-то переименует файл, находящийся в каталоге, вы об этом узнаете, однако переименование самого каталога останется незамеченным (конечно, для отслеживания подобных изменений можно дополнительно следить за родительским каталогом).
Компонент Fi1eSystemMoni tor, как и все компоненты разных панелей элементов VS .NET, является конкретной реализацией более общего класса. В данном случае это класс FileSystemWatcher, производный от класса Component. Режим отслеживания подкаталогов включается следующей командой:
FileSystemWatcherl.IncludeSubdirectohes = True
На рис. 9.6 изображен примерный вид формы. Компонент FileSystemWatcher находится на вкладке Components. Визуального интерфейса он не имеет и поэтому при размещении на форме он отображается на служебной панели, показанной в нижней части рис. 9.6.
Монитор активизируется следующей несложной процедурой:
Private Sub btnStart_Click(ByVal sender As System.Object,_
ByVal e As System.EventArgs)Handles btnStart.Click
If CheckPath()Then
FileSystemWatcherl.Path = txtDirectory.Text
FileSystemWatcherl.IncludeSubdirectories = chkRecursive.Checked
FileSystemWatcherl.EnableRaisingEvents = True
End If
End Sub
Для пущей надежности мы убеждаемся в том, что заданный каталог существует. При проверке используется класс Directory, поэтому программа должна импортировать пространство имен System. 10:
Function CheckPath()As Boolean
If Directory.Exists(txtDirectory.Text) Then
Return (True) Else
txtDirectory.Text= "" txtDirectory.Focus 0
MsgBox("No directory by that name exists!") Return False
End If End Function
Рис. 9.6. Пример использования компонента FileSystemWatcher
VB .NET автоматически подключает обработчик события. В следующем фрагменте при изменениях в заданном каталоге вызывается окно сообщения:
Private Sub FileSystemWatcherl_Changed(ByVal sender As Object.
ByVal e As System.IO.FileSystemEventArgs) Handles
FileSystemWatcher1.Changed
MsgBox(txtDirectory.Text & "has changed!")
End Sub
К сожалению, мы не сможем полностью описать этот замечательный компонент. Но прежде, чем вы перейдете к самостоятельным исследованиям, примите к сведению пару полезных советов:
Если вам потребуется более точный контроль, обратитесь к описанию свойства NotifyFilter в электронной документации. Его значение задается в виде констант перечисляемого типа, объединенных оператором Ог, и определяет типы отслежи-
ваемых изменениях.Например, можно отслеживать изменения атрибутов, имени и размера файла.
Без задания свойств Filter и NotifyFilter программа, осуществляющая рекурсивный мониторинг активного или корневого каталога, становится практически бесполезной — событие Changed будет слишком часто срабатывать в результате обычных служебных операций Windows.