Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга о KOL.doc
Скачиваний:
29
Добавлен:
30.04.2019
Размер:
1.77 Mб
Скачать

2.13. Список файлов и директорий (tDirList)

Если уж я начал говорить о списках, то естественно продолжить списком особого рода - списком имен файлов. В KOL имеется объектный тип TDirList, существенно упрощающий работу с директориями. Он инкапсулирует в себе обращение к функциям API, просматривающим содержимого папки, и составляет ее каталог. Все, что нужно для того, чтобы начать работать с файлами целой директории - это вызвать один из конструкторов (NewDirList или NewDirListEx), и получить объект, хранящий "досье" на все заказанные файлы, лежащие по указанному пути (и удовлетворяющие заявленным требованиям).

Итак, "конструкторы":

NewDirList( path, filter, attr ) - создает список директории, читая файлы и/или директории (это зависит от параметра, задающего атрибуты искомых файлово-директорных объектов, например, FILE_ATTRIBUTE_DIRECTORY будет читать только поддиректории, FILE_ATTRIBUTE_ARCHIVE - только файлы, а 0 - все имена без разбора). Фильтр может быть только одиночным, но в нем допускаются символы шаблонирования '*' и '?'.

NewDirListEx( path, filters, attr ) - отличается от предыдущего конструктора тем, что в нем разрешается использовать несколько шаблонов, разделенных символом ';', а шаблоны, имеющие префикс '^', рассматриваются как анти-фильтры - для исключения имен, удовлетворяющих таким шаблонам.

Созданный объект типа TDirList имеет следующие методы и свойства:

Path - строка, хранящая путь к директории (всегда завершена символом '\', т.е. всегда можно выполнить конкатенацию DL.Path + DL.Names[ i ] для получения полного пути к i-му файлу);

Count - возвращает число имен файлов и поддиректорий в списке;

Names[ i ] - возвращает имена файлов по их индексу;

IsDirectory[ i ] - проверяет, что объект с индексом i является директорией;

Items[ i ] - полная структура с информацией о файле / директории (в ней есть вся информация, предоставленная системой, включая размер файла, даты его создания / модификации / последнего обращения, короткое имя, атрибуты);

Clear - очищает список;

ScanDirectory( path, filter, attr ) - позволяет сканировать содержимое другой (или пересканировать содержимое той же) директории, аналогично конструктору NewDirList;

ScanDirectoryEx( path, filters, attr ) - аналогично предыдущему методу, но по расширенным правилам, аналогично конструктору NewDirListEx;

Sort( rules ) - сортирует имена по заданным правилам. Задается целый массив правил, которые при сравнении применяются последовательно, пока первые правила не обнаруживают различия между именами. Например, правило sdrFoldersFirst - не видит различия между файлами и файлами, и между директориями и директориями, но различает только директории от файлов. Некоторые правила используются как модификаторы для применения прочих правил, например, sdrCaseSensitive;

FileList( separator, dirs, fullpaths ) - возвращает список файлов в виде строки, в которой файлы разделены заданным разделителем;

OnItem - событие, которое срабатывает для каждого считанного элемента при сканировании директории, и позволяет принять решение о включении или не-включении имени в список в соответствии с алгоритмом, задаваемым в обработчике события. Разумеется, для того, чтобы обработчик этого события можно было назначить до сканирования директории, следует при вызове конструктора в качестве пути передать пустую строку, после чего назначить объекту свой обработчик, и уже затем вызвать метод сканирования ScanDirectory или ScanDirectoryEx.

Хотя описанный здесь объект и не позволяет сканировать содержимое директории для всех поддиректорий, тем не менее, организовать рекурсивный обход всего дерева папок - это вполне разрешимая задачка даже для начинающего. Пример такого рекурсивного обхода можно найти в самом модуле KOL.pas, в реализации функции DirectorySize, которая как раз использует объект TDirList для сканирования содержимого директорий.