Программа-шпион
Мы можем воспользоваться умением создавать обработчики событий, чтобы написать любопытную программку.
Вообразите ситуацию. Вы подозреваете, что в ваше отсутствие кто-то включает компьютер и производит нежелательные изменения в многочисленных файлах и папках внутри вашей персональной папки (например, какой-то документ стерт или переименован, или в него что-то дописано). Чтобы выследить нарушителя, вы хотите знать, в какие моменты времени и какие именно файлы и папки подверглись изменениям.
Для этого нужно, чтобы при включении компьютера автоматически и невидимо для пользователя запускалась программа, отслеживающая эти изменения и записывающая их в некий, глубоко вами запрятанный текстовый файл, который вы впоследствии можете спокойно прочитать.
Для того, чтобы программа запускалась при включении компьютера, ее ярлык достаточно поместить в папку автозагрузки 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