private const uint hidden = (uint)FileAttributes.System |
(uint)FileAttributes.Hidden; // Атрибут "скрытые и/или системные"
Константы Removable и т. д. подсмотрены в Help по API-функции GetDriveType. Добавьте объявление API-функции, которую мы используем для определения типов логических дисков, присутствующих в системе. Здесь используется атрибут, который работает, благодаря InteropServices.
[DllImport("Kernel32")]
public static extern int GetDriveType (string lpRootPathName);
Теперь войдите внутрь конструктора и вставьте коды инициализации используемых объектов.
showHidden = false; // Скрытые папки пока не показываем
expandedNodes = new SortedList();
rootName = "My Computer";
rootLength = rootName.Length + 1;
searchPath = "";
В обработчик события Load вставьте коды инициализации списка:
fileList.Columns.Add ("Name", 120, HorizontalAlignment.Left); // Создаем колонки в списке файлов
fileList.Columns.Add ("Size", 75, HorizontalAlignment.Right);
fileList.Columns.Add ("Created", 120, HorizontalAlignment.Center);
fileList.Columns.Add ("Modified", 120, HorizontalAlignment.Center);
fileList.Sorting = SortOrder.Ascending; // Настраиваем способ сортировки списка файлов
fileList.ListViewItemSorter = listComparer = new FileListComparer();
Запустите и убедитесь, что введение новых элементов не вызвало ошибок компиляции (появялись лишь предупреждения о неиспользуемых объектах), а список файлов получил строку с заголовками колонок. Теперь (в обработчик события Load) мы добавим делегатов, реагирующих на события файловой системы. Это можно сделать как с помощью инструментов (в режиме дизайна), так и вручную. Предпочитаю делать это вручную, так как становится более понятным смысл производимых изменений, но при этом требуется некоторая доля аккуратности. Ниже приведен код, который отражает смысл изменений.
Либо введите изменения вручную (как показано ниже), либо добейтесь того, чтобы в коде, который генерирует дизайнер (и прячет внутрь функции InitializeComponent), появились строки с такой же мнемоникой. Некоторые из приведенных строк он уже сделал (если вы пользовались дизайнером на первой стадии), поэтому внимательно следите за его кодом. Еще раз повторю, код генерирует дизайнер, его код спрятан. Если пользуетесь дизайнером, то берите отсюда лишь смысл изменений.
fileWatcher = new FileSystemWatcher();
fileWatcher.Filter = "";
fileWatcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite |
NotifyFilters.Size | NotifyFilters.CreationTime;
fileWatcher.Renamed += new RenamedEventHandler (fileWatcher_Renamed);
fileWatcher.Changed += new FileSystemEventHandler (fileWatcher_Changed);
fileWatcher.Created += new FileSystemEventHandler (fileWatcher_Created);
fileWatcher.Deleted += new FileSystemEventHandler (fileWatcher_Deleted);
dirWatcher = new FileSystemWatcher();
dirWatcher.NotifyFilter = NotifyFilters.DirectoryName;
dirWatcher.SynchronizingObject = this;
dirWatcher.IncludeSubdirectories = true;
dirWatcher.Renamed += new RenamedEventHandler (dirWatcher_Renamed);
dirWatcher.Created += new FileSystemEventHandler (dirWatcher_Changed);
dirWatcher.Deleted += new FileSystemEventHandler (dirWatcher_Changed);
Тела функций, реагирующих на изменения, либо уже создал дизайнер, либо предстоит создать вам. Если вы идете вторым путем, то для образца приведу одну функцию.
private void fileWatcher_Renamed (object sender, RenamedEventArgs e){}
Остальные обработчики похожи на этот, но следите за типом второго параметра (см. Help). Тела функций пока остаются пустыми. После введения изменений приложение должно работать так же, как и ранее. Наблюдатели включены, но пока ничего не делают, так как нет самого дерева.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.