ПОНЯТНО О Visual Basic NET (том 3)

       

Программа-шпион


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

Вообразите ситуацию. Вы подозреваете, что в ваше отсутствие кто-то включает компьютер и производит нежелательные изменения в многочисленных файлах и папках внутри вашей персональной папки (например, какой-то документ стерт или переименован, или в него что-то дописано). Чтобы выследить нарушителя, вы хотите знать, в какие моменты времени и какие именно файлы и папки подверглись изменениям.

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

Для того, чтобы программа запускалась при включении компьютера, ее ярлык достаточно поместить в папку автозагрузки Windows (пункт Автозагрузка (StartUp) меню Пуск Windows). Остается создать саму программу, чем мы сейчас и займемся.

Вот программа:

Private Шпион As New System.IO.FileSystemWatcher

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'Настраиваем шпиона:

        Шпион.Path = "C:\Дела"

        Шпион.IncludeSubdirectories

= True

        Шпион.Filter = "*.*"

        AddHandler Шпион.Created, AddressOf Фиксируем_создание



        AddHandler Шпион.Deleted, AddressOf Фиксируем_уничтожение

        AddHandler Шпион.Renamed, AddressOf Фиксируем_переименование

        AddHandler Шпион.Changed, AddressOf Фиксируем_изменение

        Шпион.EnableRaisingEvents = True

        'Маскируем шпиона:

        Me.Opacity = 0

        Me.ShowInTaskbar = False

End Sub

Private Sub Фиксируем_создание(ByVal source As Object, ByVal e As IO.FileSystemEventArgs)

        Дописываем_в_файл("Создан файл или папка:  " & e.FullPath)

End Sub

Private Sub Фиксируем_уничтожение(ByVal source As Object, ByVal e As IO.FileSystemEventArgs)


        Дописываем_в_файл("Стерт файл или папка:  " & e.FullPath)

End Sub

Private Sub Фиксируем_переименование( ByVal source As Object, ByVal e As IO.RenamedEventArgs)

        Дописываем_в_файл("Файл или папка  " & e.OldFullPath & "  переименован в  " & e.FullPath)

End Sub

Private Sub Фиксируем_изменение(ByVal source As Object, ByVal e As IO.FileSystemEventArgs)

        Дописываем_в_файл("Изменен файл или папка:  " & e.FullPath)

End Sub

Private Sub Дописываем_в_файл(ByVal Строка As String)

        Dim Дозапись As New System.IO.StreamWriter("Журнал.txt", True)

        Дозапись.WriteLine(DateTime.Now & "  " & Строка)

        Дозапись.Close()

End Sub

Вот пример содержимого файла Журнал.txt, заполненного этой программой:

13.05.2004 16:36:24  Стерт файл или папка:  E:\Дела\колледж.txt

13.05.2004 16:38:16  Создан файл или папка:  E:\Дела\new text document.txt

13.05.2004 16:38:32  Файл или папка  E:\Дела\new text document.txt

                        переименован в  E:\Дела\институт.txt

13.05.2004 16:41:04  Изменен файл или папка:  E:\Дела\работа.txt

13.05.2004 16:41:04  Изменен файл или папка:  E:\Дела\работа.txt

Вот пояснения:

В библиотеке классов .NET Framework для присмотра за изменениями в файлах и папках существует специальный класс  FileSystemWatcher («Надсмотрщик за файловой системой») пространства имен System.IO. У него есть несколько событий, которые генерируются при вышеупомянутых изменениях. Написав обработчики этих событий, мы можем как угодно на них реагировать, в том числе и записывать информацию о них в какой-нибудь файл.

Вначале мы создаем объект Шпион указанного класса. Все действия по его настройке осуществляются при загрузке формы:

Прежде всего мы указываем шпиону, что следить нужно только за содержимым папки C:\Дела:

        Шпион.Path = "C:\Дела"

Далее мы объясняем, что нас интересует также содержимое папок, вложенных в папку Дела:



        Шпион.IncludeSubdirectories = True

Далее мы объясняем, что нас интересуют все файлы. Для этого мы настраиваем фильтр аналогично тому, как настраивали фильтр диалогового окна (20.2.2):

        Шпион.Filter = "*.*"

Следующие 4 оператора указывают на обработчиков четырех событий объекта Шпион: Created, Deleted, Renamed, Changed. Рассмотрим обработчики по порядку.

Событие Created генерируется при создании файла или папки. Параметр обработчика e принадлежит к типу FileSystemEventArgs и содержит информацию о событии. Его свойство FullPath  представляет полный адрес и имя созданного файла или папки.

Все 4 обработчика обращаются к процедуре пользователя Дописываем_в_файл, которая оператором Дозапись.WriteLine дописывает в файл Журнал.txt одну строчку. Начинается строчка с указания момента времени, когда наступило событие (DateTime.Now), а заканчивается текстом, задаваемым параметром Строка, формируемым каждым обработчиком.

В обработчике события Changed этот текст такой:

"Создан файл или папка:  " & e.FullPath

Событие Deleted генерируется при уничтожении файла или папки. Организован обработчик аналогично предыдущему.

Событие Renamed генерируется при переименовании файла или папки. Организован обработчик аналогично предыдущим с одним отличием. Параметр обработчика e принадлежит к типу RenamedEventArgs. Его свойство OldFullPath представляет полный старый адрес и имя файла или папки, а свойство FullPath представляет полный новый адрес и имя переименованного файла или папки.

Событие Changed генерируется при различных изменениях в файле или папке, например, когда содержимое файла изменилось. Организован обработчик аналогично обработчику Created.

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

Не забудьте, что шпиону нужно разрешить генерировать события:

        Шпион.EnableRaisingEvents = True

А теперь о секретности работы шпиона. Я добился ее тем, что сделал форму прозрачной и запретил значку формы появляться на панели задач:

        Me.Opacity = 0

        Me.ShowInTaskbar = False


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