Лабораторная работа № 6. Отслеживание изменений файловой системы и аппаратных изменений 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Лабораторная работа № 6. Отслеживание изменений файловой системы и аппаратных изменений



Цель работы: отслеживание событий изменения файловой системы; отслеживание событий изменения аппаратной конфигурации компьютера.

Отслеживание изменений файловой системы

Описание класса FileSystemWatcher

Для отслеживания изменений в заданном каталоге можно воспользоваться классом FileSystemWatcher из пространства имен System.IO.

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

ОС Windows уведомляет компонент об изменениях файлов в буфере, созданном объектом FileSystemWatcher. Если в течение короткого времени происходит много изменений, буфер может переполниться. В результате этот компонент не сможет отслеживать изменения в каталоге и будет давать только общие уведомления. Увеличение размера буфера с использованием свойства InternalBufferSize сопряжено с большими накладными расходами, поскольку он формируется не в выгружаемой памяти и не может быть подкачан с диска. Поэтому буфер следует делать как можно меньше, в то же время он должен быть достаточно большим, чтобы не пропустить какие-либо события, связанные с изменениями файлов. Чтобы устранить переполнение буфера, необходимо использовать свойства NotifyFilter и IncludeSubdirectories для фильтрации ненужных уведомлений.

В таблице 6.1 перечислены основные свойства класса FileSystemWatcher. В таблице 6.2 перечислены основные события класса FileSystemWatcher.

 

Таблица 6. 1 – Основные свойства класса FileSystemWatcher

Свойство Описание
1 2
Events Возвращает список обработчиков событий, которые прикреплены к данному объекту (конкретному экземпляру класса FileSystemWatcher).
EnableRaisingEvents Возвращает или задает значение, определяющее доступен ли конкретный экземпляр класса FileSystemWatcher.

Продолжение таблицы 6.1

Filter Возвращает или задает строку фильтра, используемую для определения файлов, контролируемых в каталоге.
IncludeSubdirectories Возвращает или задает значение, указывающее необходимость контроля вложенных каталогов по указанному пути.
InternalBufferSize Возвращает или задает размер в байтах внутреннего буфера.
NotifyFilter Возвращает или задает тип отслеживаемых изменений.
Path Возвращает или задает путь к каталогу, в котором будут прослеживаться изменения.

 

Таблица 6. 2 – Основные события класса FileSystemWatcher

Событие Описание
Changed Происходит при изменении файла или каталога по заданному пути Path.
Created Происходит при создании файла или каталога по заданному пути Path.
Deleted Происходит при удалении файла или каталога по заданному пути Path.
Error Происходит, когда экземпляру класса FileSystemWatcher не удается продолжить отслеживание изменений или при переполнении внутреннего буфера.
Renamed Происходит при переименовании файла или каталога по заданному пути Path.

 

Примеры работы с классом FileSystemWatcher приведены в подразделе 6.1.2.

 

Приложение для отслеживания изменений файловой системы

В качестве примера рассмотрим приложение, изображенное на рисунке 5. В таблице 6.3 приведено описание используемых в приложении элементов управления.

 

Таблица 6. 3 – Элементы управления приложения для отслеживания изменений файловой системы

Элемент управления Класс Описание
1 2 3
button1 Button Командная кнопка для выбора каталога.
button2 Button Командная кнопка «Очистить поле вывода информации».

Продолжение таблицы 6.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;

 

 

Рисунок 5 – Окно приложения для отслеживания изменений файловой системы

 

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();

 }

16. В данной работе создается новый журнал аудита изменений файловой системы 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();

 }



Поделиться:


Последнее изменение этой страницы: 2021-12-07; просмотров: 67; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.147.42.168 (0.043 с.)