Отныне все сообщения, приносимые делегатом события UpdateLog, будут безотказно отображаться в списке (журнале) событий logList. Мы будем пользоваться этим и при создании других компонентов. Полезно назвать по именам всех участников процесса доставки сообщения (событие, делегат и функция отклика). Найдите все эти объекты в качестве упражнения. Если со списком картинок treeImages и новым кодом вы справились успешно, то запустив приложение, должны увидеть дерево, в котором присутствуют только диски.
¨ Журнал событий (список logList в нижней части формы) пока не должен отображать те изменения, которые Windows непрерывно вносит в свои журналы событий (software.log, ntuser.dat.log и другие), но вскоре мы добъемся и такого поведения.
¨ При выборе узла дерева его изображение должно изменяться.
¨ Узлы дерева (кроме корневого) не имеют маркеров раскрытия, так как мы заполнили только два уровня дерева (корень и уровень дисков).
Теперь надо создать метод (назовем его FillFolder), который будет опрашивать папки, вложенные внутрь заданного узла (диска или папки) и генерировать вложенные узлы (папки), опираясь на эту информацию.
Напомним, что наше дерево — это лишь отображение реальной файловой системы. Каждому узлу виртуального дерева соответствует реальный файловый путь и в данный момент он нам понадобится. Если ориентироваться только на один конкретный уровень вложенности, то получить эту информацию просто, но если рассматривать произвольный уровень вложенности, то захочется создать вспомогательный метод, который по заданному узлу виртуального дерева вычисляет полный файловый путь в реальной файловой системе.
string GetPathToFolder(TreeNode node) { return node.FullPath.Substring(rootName.Length + 1) + '\\'; }
Корень дерева (узел "My Computer") нам не нужен. Он портит стандартный файловый путь и введен только из уважения к традиции Microsoft использовать виртуальные папки типа: MyDocuments, MyMusic, History, Cookies и т. д. Поэтому при обращении к файловой системе мы удаляем часть ("My Computer") из полного пути, который был получен из дерева. Рассмотрим еще один вспомогательный метод GetFolderName, который выделяет из полного файлового пути имя папки.
string GetFolderName(string path) { return path.TrimEnd('\\').Remove(0, path.LastIndexOf('\\') + 1); }
Теперь разработаем код метода FillFolder, который будет выполняться при заполнении узла дерева вложенными папками. Главной функцией этого метода является получение массива папок (директорий), вложенных в конкретный объект файловой системы — GetDirectories. Им может быть как папка, так и диск (более точно, корневая директория диска, например D:\).
void FillFolder(TreeNode node, int depth)
{
if (depth == 0) return;
try
{
string path = GetPathToFolder(node);
if (Директория path существует)
{
TreeNodeCollection nodes = Получите коллекцию вложенных узлов
string[] folders = Получите коллекцию вложенных папок (используйте Directory)
if (node.Tag == null)
{
foreach (Для каждой строки folder массива folders)
{
DirectoryInfo dir = Получите информацию о папке с именем folder
bool usual = ((uint)dir.Attributes & hidden) == 0;
if (usual || showHidden)
{
int imgID = usual ? 14 : 16;
TreeNode n = new TreeNode(GetFolderName(folder), imgID, imgID+1);
nodes.Add(n);
FillFolder(n, depth - 1);
}
}
}
else
{
foreach (TreeNode n in node.Nodes)
FillFolder(n, depth - 1);
}
node.Tag = true;
}
}
catch (Exception ex) { SetMessage(ex.Message); }
}
Спрятанные и системные папки надо показывать только если поднят флаг showHidden. Для выбора изображений папки используйте соответствующие индексы списка изображений. Метод FillFolder реализует логику рекурсивного прохода по дереву файловой системы с глубиной выборки depth, заданной в виде параметра. Если depth==1, то дерево заполнится только на один уровень вложенности. Рассматриваемый алгоритм предложил и реализовал студент ФПС Антон Тур.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.