Иллюстрированный самоучитель по VB.NET

       

Монитор файловой системы


К числу принципиальных новшеств, отличающих 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

К сожалению, мы не сможем полностью описать этот замечательный компонент. Но прежде, чем вы перейдете к самостоятельным исследованиям, примите к сведению пару полезных советов:

  • Свойство Filter устанавливает фильтр для имен файлов и каталогов, за которыми вы хотите следить.

  • Существует много разных типов изменений, поэтому в реальных программах .рекомендуется более точно определять интересующие вас события. Например, если вы хотите, чтобы программа оповещалась только о создании новых файлов, организуйте обработку события Created.

    Если вам потребуется более точный контроль, обратитесь к описанию свойства NotifyFilter в электронной документации. Его значение задается в виде констант перечисляемого типа, объединенных оператором Ог, и определяет типы отслежи-

    ваемых изменениях.Например, можно отслеживать изменения атрибутов, имени и размера файла.

    Без задания свойств Filter и NotifyFilter программа, осуществляющая рекурсивный мониторинг активного или корневого каталога, становится практически бесполезной — событие Changed будет слишком часто срабатывать в результате обычных служебных операций Windows.


    Содержание раздела