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