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

public string MyTrim(string s)

{

if (col == 1)

{

if (s.LastIndexOf('K') != -1)

{

s = s.TrimEnd('K', ' ');

s = (double.Parse(s) * 1024).ToString();

}

else if (Справа есть символ 'M')

{

s = Устраните его;

s = (double.Parse(s) * 1048576).ToString();

}

else if (Справа есть символ 'G')

{

s = Устраните его;

s = (double.Parse(s) * 1073741824).ToString();

}

}

return s;

}

public int Compare(object x, object y)

{

int res = 0;

string

s1 = MyTrim(((ListViewItem)x).SubItems[col].Text),

s2 = MyTrim(((ListViewItem)y).SubItems[col].Text);

switch (col)

{

case 0: res = s1.CompareTo(s2); break;

case 1: res = Повторите проверку для типа double;

case 2:

case 3: res = Повторите проверку для типа DateTime;

}

Если порядок сортировки убывающий (SortOrder.Descending)

измените знак результата

return res;

}

}

}

При реализации ветви case 1: добавьте код сравнения вещественных чисел, спрятанных в строках текста s1 и s2 (используйте Parse). Во второй и третьей колонках списка файлов расположены даты (объекты DateTime). Напишите код сравнения дат. Добавьте код реверса сортировки (используйте перечисление SortOrder). Уберите комментарий в тех местах класса FileSystemControl, где было обращение к FileComparer.

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

void fileList_ColumnClick(object sender, ColumnClickEventArgs e)

{

FileComparer cmp = fileList.ListViewItemSorter as FileComparer;

bool repeat = cmp.col == e.Column;

cmp.col = e.Column;

if (repeat)

cmp.order = cmp.order == SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending;

fileList.Sort();

}

Проверьте способность приложения сортировать список файлов по всем четырем колонкам.

Наблюдатели за файловой системой

Кроме демонстрации дерева дисков, папок и списка файлов, мы собираемся наблюдать за файловой системой, реагировать на изменения в ней и отображать их в дереве в режиме реального времени. Мы также собираемся оповещать приложение Client об изменениях в состоянии дерева (а позже и других компонентов) с тем, чтобы оно смогло отобразить сообщения в журнале событий logList. Если разрабатывать приложение для серьезной компании, то следует подумать о возможности сохранения журнала событий в файле. Например, для того, чтобы восстановить хронологию изменений в файловой системе.

Суровым ограничением наблюдателя (объекта типа FileSystemWatcher) является то, что один объект не может следить за всей файловой системой. Самой крупной единицей слежения является корневая директория логического диска и все вложенные в нее папки. Учитывая сказанное, следует создать не один наблюдатель, а множество (их число зависит от количества дисков). Каждый объект FileSystemWatcher будет следить за файлами и папками своего диска. Количество необходимых наблюдателей определяется в момент загрузки FileSystemControl. Пустой список наблюдателей уже создан в конструкторе класса.

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

Объекты FileSystemWatcher требуют тонкой настройки своих свойств. Кроме указанных EnableRaisingEvents и Path, важным свойством наблюдателей является NotifyFilter. Приведем перечень всех важных свойств.

¨  Path — позволяет задать файловый путь к папке или диску, за содержимым которой он должен наблюдать.