Введите в класс 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), текст которых соответствует именам логических дисков, а изображения — их типам. Имена следует получить из перечня логических дисков. Список дисков можно получить одним из трех способов.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.