Windows Management Instrumentation. Опрос свойств, методов и описателей. Разработка компонента WMIControl, страница 23

Введите в класс FileSystemControl множество переменных. Постарайтесь вникнуть в их смысл. Он пояснен в комментариях.

#region Data

TreeNode root;                        // Корневой узел

List<FileSystemWatcher> watchers;     // Список наблюдателей за объектами файловой системы (по числу дисков)

ManagementEventWatcher watchUSB, watchCD; // Наблюдатели за портом USB и приводом CDROM

List<string> expandedNodes;        // Список раскрытых узлов

string pathToFind = "";            // Искомый файловый путь

int hiddenCount;                   // Количество скрытых файлов

bool showHidden;                   // Флаг отображения скрытых объектов

//==== Полезные конствнты: атрибут "скрытые и/или системные", и т. д.

const FileAttributes hidden = FileAttributes.System | FileAttributes.Hidden;

const string separator = "   ", rootName = "My Computer";

public event Action<string> UpdateLog;  // Событие, возбуждаемое при обнаружении изменений

#endregion

Делегатный тип Action<string> поможет генерировать события, уведомляющие форму об изменениях в системе. Эти события будут генерировать компоненты FileSystemControl, SysInfoControl, и другие. Войдите внутрь конструктора и добавьте коды инициализации используемых объектов.

watchers = new List<FileSystemWatcher>();

expandedNodes = new List<string>();

fileList.Sorting = SortOrder.Ascending;

fileList.ListViewItemSorter = new FileComparer(); // Связывание с объектом, управляющим сортировкой

checkHidden.CheckedChanged += new EventHandler(checkHidden_CheckedChanged);

Disposed += new EventHandler(FileSystemControl_Disposed);

Вспомните, что обработчики событий надо создавать с помощью студии. Вы можете создать обработчик события Load для компонента FileSystemControl, но можно поступить и по-другому. Можно добавить (переопределить) новую версию виртуальной функции OnLoad, которая определена в классе Control.

protected override void OnLoad(EventArgs e)

{

base.OnLoad(e);

showHidden = checkHidden.Checked;

try

{

FillTree();

SetEventWatchers();

}

catch (Exception ex)

{

new FormMsg(null, ex.Message, 3000);

}

}

Для создания заготовок методов FillTree и SetEventWatchers используйте IntelliSense. Компонент fileList типа ListView будет отображать список файлов выбранной папки. В этом списке необходимо определить множество колонок. Это можно сделать как в режиме дизайна, так в коде какого-либо метода класса FileSystemControl. Если вы надумаете выполнить это с помощью кода, то следующий пример показывает используемую при этом технику. Думаю, однако, что набор колонок лучше добавить в режиме дизайна и метод SetFileList вам не понадобится.

void SetFileList()

{

fileList.Columns.Add("Name", 200, HorizontalAlignment.Left); // Создаем колонки в списке файлов

fileList.Columns.Add("Size", 100, HorizontalAlignment.Right);

fileList.Columns.Add("Created", 150, HorizontalAlignment.Left);

fileList.Columns.Add("Modified", 150, HorizontalAlignment.Left);

fileList.Sorting = SortOrder.Ascending;

}

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

Управление деревом файловой системы

Для того, чтобы заполнить дерево узлами, отражающими состояние объектов файловой системы (это — диски и папки), необходимо сначала правильно заполнить коллекцию (ImageList) картинок, о способе индексации которых мы договорились ранее. Я рассчитываю, что с этой задачей вы уже справились, и можно начать заполнение с корневого узла "My Computer". Внутрь этого узла следует поместить множество узлов (т.е. объектов класса TreeNode), текст которых соответствует именам логических дисков, а изображения — их типам. Имена следует получить из перечня логических дисков. Список дисков можно получить одним из трех способов.