ЛАБОРАТОРНАЯ РАБОТА № 2. ОТСЛЕЖИВАНИЕ ИЗМЕНЕНИЙ ФАЙЛОВОЙ СИСТЕМЫ И АППАРАТНЫХ ИЗМЕНЕНИЙ
Цель работы;
1. Отслеживание событий изменения файловой системы
2. Отслеживание событий изменения аппаратной конфигурации компьютера
Отслеживание изменений файловой системы
Описание класса FileSystemWatcher
Для отслеживания изменений в заданном каталоге можно воспользоваться классом FileSystemWatcher из пространства имен System.IO.
Данный класс предназначен для отслеживания изменений в файловой системе. Изменения можно отслеживать как на локальном компьютере, так и на удаленном.
ОС Windows уведомляет компонент об изменениях файлов в буфере, созданном объектом FileSystemWatcher. Если в течение короткого времени происходит много изменений, буфер может переполниться. В результате этот компонент не сможет отслеживать изменения в каталоге и будет давать только общие уведомления. Увеличение размера буфера с использованием свойства InternalBufferSize сопряжено с большими накладными расходами, поскольку он формируется не в выгружаемой памяти и не может быть подкачан с диска. Поэтому буфер следует делать как можно меньше, в то же время он должен быть достаточно большим, чтобы не пропустить какие-либо события, связанные с изменениями файлов. Чтобы устранить переполнение буфера, необходимо использовать свойства NotifyFilter и IncludeSubdirectories для фильтрации ненужных уведомлений.
В таблице 2.1 перечислены основные свойства класса FileSystemWatcher. В таблице 2.2 перечислены основные события класса FileSystemWatcher.
|
|
Таблица 2.1 – Основные свойства класса FileSystemWatcher
Свойство | Описание |
1 | 2 |
Events | Возвращает список обработчиков событий, которые прикреплены к данному объекту (конкретному экземпляру класса FileSystemWatcher) |
EnableRaisingEvents | Возвращает или задает значение, определяющее доступен ли конкретный экземпляр класса FileSystemWatcher |
Продолжение таблицы 2.1
Filter | Возвращает или задает строку фильтра, используемую для определения файлов, контролируемых в каталоге |
IncludeSubdirectories | Возвращает или задает значение указывающее необходимость контроля вложенных каталогов по указанному пути |
InternalBufferSize | Возвращает или задает размер в байтах внутреннего буфера |
NotifyFilter | Возвращает или задает тип отслеживаемых изменений |
Path | Возвращает или задает путь к каталоге, в котором будут прослеживаться изменения |
Таблица 2.2 – Основные события класса FileSystemWatcher
Событие | Описание |
Changed | Происходит при изменении файла или каталога по заданному пути Path |
Created | Происходит при создании файла или каталога по заданному пути Path |
Deleted | Происходит при удалении файла или каталога по заданному пути Path |
Error | Происходит, когда экземпляру класса FileSystemWatcher не удается продолжить отслеживание изменений или при переполнении внутреннего буфера |
Renamed | Происходит при переименовании файла или каталога по заданному пути Path |
|
|
Примеры работы с классом FileSystemWatcher приведены в подразделе 2.1.2.
Приложение для отслеживания изменений файловой системы
В качестве примера рассмотрим приложение, изображенное на рисунке 2.1. В таблице 2.3 приведено описание используемых в приложении элементов управления.
Таблица 2.3 – Элементы управления приложения для отслеживания изменений файловой системы
Элемент управления | Класс | Описание |
1 | 2 | 3 |
button1 | Button | Командная кнопка для выбора каталога |
button2 | Button | Командная кнопка «Очистить поле вывода информации» |
Продолжение таблицы 2.3
1 | 2 | 3 |
button3 | Button | Командная кнопка «Начать мониторинг файловой системы» |
button4 | Button | Командная кнопка «Остановить мониторинг» |
button5 | Button | Командная кнопка «Уничтожить журнал событий» |
checkedListBox1 | CheckedListBox | Список с флажками для выбора отслеживаемых изменений файловой системы |
checkedListBox2 | CheckedListBox | Список с флажками для выбора фильтра - определения файлов, изменения которых будут отслеживаться |
folderBrowserDialog1 | FolderBrowserDialog | Диалоговое окно для выбора папки, в которой будут отслеживаться изменения |
richTextBox1 | RichTextBox | Окно вывода сообщений об изменениях файловой системы |
richTextBox2 | RichTextBox | Окно вывода новых записей из журнала аудита файловой системы FileSystemAudit |
groupBox1 | GroupBox | Контейнер для размещения списка отслеживаемых событий checkedListBox1 |
groupBox2 | GroupBox | Контейнер для размещения фильтра checkedListBox2 |
groupBox3 | GroupBox | Контейнер для размещения компонента richTextBox1 |
groupBox4 | GroupBox | Контейнер для размещения компонента richTextBox2 |
textBox1 | TextBox | Окно вывода наименования каталога, в котором будут отслеживаться изменения |
|
|
Последовательность программирования приложения:
1. Для работы с журналами событий необходимо подключить пространства имен System.Diagnostics и System.IO :
using System.IO;
using System.Diagnostics;
2. Объявление глобальных переменных:
// имя каталога для аудита файловой системы
public string dirname;
// создание объекта watcher для отслеживания
//изменений файловой системы
public FileSystemWatcher watcher;
//создание объекта elog для работы с журналом
//аудита фаловой системы
public EventLog elog;
3. Для события Click кнопки button1 (Выбор каталога) пишем следующий программный код:
|
|
// ---------------------------------------------
// выбор каталога для аудита файловой системы
// ---------------------------------------------
private void button1_Click(object sender, EventArgs e)
{
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) dirname = folderBrowserDialog1.SelectedPath;
textBox1.Text = dirname;
}
4. Для события Click кнопки button2 (Очистить поле вывода информации) пишем следующий программный код:
// ---------------------------------------------
// Очистить поле вывода информации
// ---------------------------------------------
private void button2_Click(object sender, EventArgs e)
{
richTextBox1.Clear();
richTextBox2.Clear();
}
8. В данной работе создается новый журнал аудита изменений файловой системы FileSystemAudit. Для перехвата событий записи в журнал FileSystemAudit необходимо создать свой обработчик. Данный обработчик событий имеет вид:
// ---------------------------------------------
// Перехват событий записи в журнал
// ---------------------------------------------
protected void OnEntryWritten(object sender, EntryWrittenEventArgs e)
{
richTextBox2.AppendText("Запись в журнал " + ((EventLog)sender).LogDisplayName + " Время " + e.Entry.TimeWritten + "Позиция " + e.Entry.Index + "\r\n");
}
5. Для отслеживания изменений файловой системы необходимо создать свои обработчики событий и добавить их к списку обработчиков событий, которые прикреплены к данному объекту (в данном случае файловой системе). События, отслеживаемые файловой системой, приведены в таблице 1.6. В данной работе с целью упрощения созданы два новых обработчика событий: OnChanged – отслеживает создание, удаление и изменение файлов и папок и OnRenamed – отслеживает переименование файлов и папок. Новые обработчики событий имеют вид:
// ---------------------------------------------
// Отслеживание создания, удаления и изменение
// файлов и папок
// ---------------------------------------------
private void OnChanged(object source, FileSystemEventArgs e)
{
richTextBox1.AppendText(e.FullPath + " " + e.ChangeType + "\r\n");
// Запись в журнал FileSystemAudit
elog.WriteEntry(e.FullPath + " " + e.ChangeType, EventLogEntryType.Information);
}
// ---------------------------------------------
// Отслеживание переименований файлов и папок
// ---------------------------------------------
private void OnRenamed(object source, RenamedEventArgs e)
{
richTextBox1.AppendText(e.OldFullPath + " переименован в " + e.FullPath + "\r\n");
// Запись в журнал FileSystemAudit
elog.WriteEntry(e.OldFullPath + " переименован в " + e.FullPath, EventLogEntryType.Information);
}
6. Для события Click кнопки button3 (Начать мониторинг событий файловой системы) пишем следующий программный код:
// ---------------------------------------------
// Мониторинг событий файловой системы
// ---------------------------------------------
private void button3_Click(object sender, EventArgs e)
{
watcher = new FileSystemWatcher();
watcher.Path = dirname;
// Установка фильтров
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
// Список файлов, за которыми ведется наблюдение
watcher.Filter = "";
if (checkedListBox2.SelectedItem != null)
if (checkedListBox2.SelectedIndex == 4) watcher.Filter = "*.*";
else
{
if (checkedListBox2.SelectedIndex == 1) watcher.Filter = "*.txt;*.doc;*.rtf";
if (checkedListBox2.SelectedIndex == 2 && watcher.Filter.Length != 0) watcher.Filter += ";*.exe";
if (checkedListBox2.SelectedIndex == 3 && watcher.Filter.Length != 0) watcher.Filter += ";*.dll";
if (checkedListBox2.SelectedIndex == 2 && watcher.Filter.Length != 0) watcher.Filter += ";*.bmp;gif";
}
// Добавление обработчиков событий
if (checkedListBox1.SelectedIndex == 4)
{
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
}
else
{
if (checkedListBox1.SelectedIndex == 0) watcher.Changed += new FileSystemEventHandler(OnChanged);
if (checkedListBox1.SelectedIndex == 1) watcher.Created += new FileSystemEventHandler(OnChanged);
if (checkedListBox1.SelectedIndex == 2) watcher.Deleted += new FileSystemEventHandler(OnChanged);
if (checkedListBox1.SelectedIndex == 3) watcher.Renamed += new RenamedEventHandler(OnChanged);
}
watcher.EnableRaisingEvents = true;
// Проверяем, существует ли журнал аудита файловой системы
// Имя программы, связанной с журналом
string eventSource = "ФайловаяСистема";
// Имя журнала
string logName = "FileSystemAudit";
// Если программа еще не зарегистрирована,
//то регистрируем ее
if (!EventLog.SourceExists(eventSource))
{
EventLog.CreateEventSource(eventSource, logName);
}
// Объект для работы с журналом
elog = new EventLog();
elog.Log = logName;
elog.Source = eventSource;
elog.EntryWritten += new EntryWrittenEventHandler(OnEntryWritten);
// Включаем наблюдение
elog.EnableRaisingEvents = true;
}
7. Для события Click кнопки button4 (Остановить мониторинг) пишем следующий программный код:
// ---------------------------------------------
// Остановить мониторинг событий файловой системы
// ---------------------------------------------
private void button4_Click(object sender, EventArgs e)
{
watcher.Changed -= OnChanged;
watcher.Created -= OnChanged;
watcher.Deleted -= OnChanged;
watcher.Renamed -= OnRenamed;
elog.Close();
elog = null;
}
8. Для события Click кнопки button5 (Уничтожить журнал событий) пишем следующий программный код:
// ---------------------------------------------
// Уничтожение журнала FileSystemAudit
// ---------------------------------------------
private void button5_Click(object sender, EventArgs e)
{
// Имя программы, связанной с журналом
string eventSource = "ФайловаяСистема";
// Имя журнала
string logName = "FileSystemAudit";
// Удаляем регистрацию программы
if (EventLog.SourceExists(eventSource))
{
EventLog.DeleteEventSource(eventSource);
}
// Удаляем журнал
if (EventLog.Exists(logName))
{
EventLog.Delete(logName);
}
richTextBox1.Clear();
richTextBox2.Clear();
}
Дата добавления: 2018-08-06; просмотров: 419; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!