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

}

public void RefreshList (TreeNode node)

{

  fileList.Items.Clear();    fileList.Refresh();

  if (Полученный из параметра узел не является корнем)

    FillList (Создайте новый объект типа DirectoryInfo, который соответствует выбранной папке);

}

К услугам метода RefreshList мы обратимся еще раз, когда будем управлять отображением скрытых объектов файловой системы. Метод FillList надо разработать. Его назначение—заполнить список (элемент fileList типа ListView), расположенный в правой части нашей формы, строками, которые содержат информацию о файлах в выбранной папке. На самом деле список заполняется объектами типа ListViewItem, которые можно конструировать на основе массива текстовых строк. Этими строками заполняются колонки списка, которые по традиции MFC Microsoft называет SubItems. При работе с ListView надо усвоить особенности терминологии. Понятию Item соответствует строка списка, а понятию SubItem — столбец (или колонка).

Такие странные имена объясняются тем, что ListView умеет работать не только в режиме таблицы (см. значение стиля View для элемента ListView—у нас оно равно Details), но и в режиме списка картинок (значение стиля SmallIcon или LargeIcon). Для удобства создания объектов класса ListViewItem введем вспомогательный метод.

private string[] GetFileData (FileInfo file)

{

  double sz = (file as FileInfo).Length / 1024.0;  // Показываем размер в килобайтах или байтах ?

  string size = sz < 1 ?

    string.Format ("{0:f0}", sz*1024 ) :  // в байтах

    string.Format ("{0:f2}  K", sz);        // в килобайтах

  return new string[]

  {

    file.Name,

    (file.Attributes & FileAttributes.Directory) == 0 ? size : "",

    file.CreationTime.ToShortDateString() + dateSep +

    file.CreationTime.ToShortTimeString(),

    file.LastWriteTime.ToShortDateString() + dateSep +

    file.LastWriteTime.ToShortTimeString()

  };

}

В методе GetFileData мы форматируем данные разных типов. Разделитель dateSep используется только в колонках дат. GetFileData следует вызвать в процедуре заполнения списка, заготовка которой приведена ниже.

private void FillList (DirectoryInfo info)

{

  if (папка не существует (Floppy or CD not inserted)) // Use parameter

    return;

  FileInfo[] files;  // Получаем список файлов текущей папки

  try { files = info.GetFiles(); } catch { return; }

  UpdateStatusBar (Color.WhiteSmoke, "Refreshing file list...");

  fileList.BeginUpdate();

  fileWatcher.Path = info.FullName;   // Настраиваем наблюдателя за файлами

  fileWatcher.EnableRaisingEvents = files.Length != 0;

  fileList.Items.Clear();

      // Создайте цикл прохода по файлам

    if (надо показывать скрытве файлы или атрибут файла не hidden)

                   // Вставляем в список новый объект класса ListViewItem (используйте метод GetFileData)

  fileList.EndUpdate();

}

Запустите и проверьте. Если вы справились с последним блоком заданий, то при выборе папки в дереве tree должен ожить и заполняться строками текста список файлов fileList. Ниже показан список файлов после сортировки по размеру (Size).

Наблюдатель за файлами

Так как ожил список файлов, то настала пора разработать коды уже существующих обработчиков событий, порождаемых вторым наблюдателем (fileWatcher). Манипулирование списком заметно проще управления деревом, поэтому подробных подсказок для разработки функций обработки событий Created, Renamed, Changed не будет. Приведем лишь код вспомогательной функции, которая понадобится при поиске строки списка.

private bool FindListItem (string name)

{

  foreach (ListViewItem item in fileList.Items)

  {

    curItem = item;

    if (string.Compare (item.SubItems[0].Text, name, true) == 0) // Ignore case

      return true;

  }

  return false;

}