Windows Management Instrumentation. События в WMI. Библиотека классов MyWMI. Особенности работы с большим деревом, страница 19

Здесь учтена деталь, которую мы уже упоминали,—наблюдатели выдают имена объектов без учета регистра (все буквы строчные). Именно поэтому при поиске строки мы пользуемся статическим методом Compare, который позволяет сравнивать текстовые строки без учета регистра. Можно было бы поступить по-другому—явно приводить все строки к нижнему регистру (см. метод ToLower). Заметим, что именно так мы работали с деревом.

Еще одна деталь реализации наблюдателя касается особенностей работы с файлами, которыми обладает Microsoft Word. Попробуйте протестировать наблюдатель fileWatcher, многократно повторяя процедуру:

¨  Открыть Word-документ, который расположен в наблюдаемой папке,

¨  Ввести в документ исправление и записать,

В окне списка вы увидите настоящую свистопляску переименований и создания временных файлов (типа .tmp). Наблюдатель будет захлебываться событиями и весьма вероятно, что придется опять прибегнуть к помощи метода Invoke, так как, возможно, появятся исключения. Я справился без помощи Invoke, но в определенные моменты фильтровал файлы типа .tmp. Это можно сделать, например, так:

if (file.Extension.Equals(".tmp"))

  return;

Некоторые наши студенты обошлись без фильтрации. Глухов А.А. и Тихановский А.С. проявили нестандартные и весьма интересные подходы к управлению как деревом, так и списком. Их решения надежно работают, но я не готов обсуждать их сейчас (сначала надо осмыслить). Отмечу лишь, что Тихановский А.С. почти все манипуляции с объектами файловой системы производит с помощью классов WMI, а не классов DirectoryInfo и FileInfo.

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

private void fileList_ColumnClick (object sender, ColumnClickEventArgs e)

{

  bool repeated = // Повторное-ли нажатие? (Спросите listComparer. Он помнит)

  listComparer.col = e.Column;

  if (repeated)

    listComparer.order = // Поменяйте способ сортировки

  fileList.Sort(); // Отсортируйте

}

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

Скрытые папки

Перейдите в проект Client и откройте файл MainForm.cs в режиме дизайна. Вспомните, что на первой странице блока (TabControl) из четырех страниц (TabPage) размещена кнопка bHidden, которая должна включать и выключать режим видимости системных или скрытых папок. Для того, чтобы ввести обработчик события нажатия этой кнопки, совершите двойной щелчок над ней и введите в тело обработчика код, который приведен ниже.

private void bHidden_Click (object sender, EventArgs e)

{

  explorer.showHidden = !explorer.showHidden;

  explorer.RefreshTree();

  bHidden.ImageIndex = explorer.showHidden ? 1 : 0;

}

Здесь мы обращаемся к DLL, а точнее, к элементу ExplorerControl, изменяем в нем значение флага showHidden и вызываем функцию RefreshTree, которая должна выполнить достаточно сложный маневр над деревом, отображающим файловую систему. Он заключается в том, чтобы:

¨  Заморозить перерисовку дерева и запомнить его текущее состояние,

¨  Уничтожить содержимое тех узлов, которые в данный момент раскрыты (и еще на один уровень вглубь),

¨  Заново заполнить узлы дерева (только те, которые необходимо) с учетом необходимости показать или скрыть специальные папки,

¨  Восстановить состояние дерева, то есть раскрыть те узлы, которые были раскрыты до нажатия кнопки.

¨  Разрешить перерисовку дерева.

¨  Восстановить текущий узел дерева и заново заполнить список файлов с учетом необходимости показать или скрыть специальные файлы.