Обращаемся к операционной системе
Для того чтобы оживить дерево в его начальном состоянии, осталось добавить код функции NotEmpty, которая проверяет текущий узел (файловый адрес папки) на наличие в нем вложенных папок и возвращает true в случае успеха и false, в случае если папка пуста или в ней присутствуют только файлы.
Примечание
Здесь важно отметить, что даже в пустой или вновь созданной папке всегда присутствуют два объекта файловой системы. Это так называемые "точки", или каталоги с именами: "." и "..". Они, возможно, знакомы вам со времен использования команд DOS.
В библиотеке MFC имеется класс CFileFind, который умеет обнаруживать в папке любые объекты файловой системы. Если объекту такого класса, который обнаружил объект "точка", задать вопрос isDirectory (), то он ответит утвердительно. Тот же ответ будет получен и на другой вопрос isDots (). Другим объектам файловой системы, настоящим папкам и файлам, соответствуют другие ответы на эти же вопросы. Папки отвечают на первый вопрос утвердительно, а на второй отрицательно. Простым файлам нет смысла задавать второй вопрос, так как они отвечают отрицательно на первый. Для них актуален другой вопрос isHidden (), на который утвердительно отвечают файлы с Windows-атрибутом hidden. Его можно использовать для управления показом файлов. В случае если папка содержит только такие файлы, то мы будем считать, что она пуста. Если в папке есть и другие, то в их числе могут быть и mgn-файлы наших документов. В этом случае мы будем считать, что папка не пуста.
С учетом сказанного строим алгоритм и функцию проверки файлового адреса:
bool CLeftView::NotErapty(CString s) { //====== Параметр s содержит текущий файловый путь //====== Объект класса, умеющего искать нечто в папке CFileFind cff; //====== Дополняем путь маской *.* или \*.* s += s.Right(l) == '\\'? "*.*": "\\*.*"; BOOL bFound = cff.FindFile(s); //====== Цикл поиска настоящих объектов while (bFound) { bFound = cff.FindNextFile(); //====== Это папка? if (cff. IsDirectory () &&! cf f. IsDots ()) return true; //====== Это файл? if (!cff.IsDirectory() SS!cff.IsHidden()) return true; } //====== He найдены объекты, достойные внимания return false; }
Отметьте, что цикл while не будет продолжительным, так как выход из него происходит при обнаружении первой же настоящей папки или файла. Запустите приложение, устраните возможные ошибки и убедитесь в том, что дерево с изображениями дисков действительно появляется в левом окне. При раскрытии узлов дерева, соответствующих "не пустым" дискам, появляется только одно изображение, которое определяется нулевым индексом системного списка (рис. 5.2). Вы помните, что в "непустые" узлы мы вставляли нулевые элементы.
Рекомендуем с учебными целями ввести исправления и добиться демонстрации не только папок, но и файлов. Убедитесь в том, что различным типам файлов соответствуют разные изображения. Они, как вы помните из третьего урока и знаете из опыта общения с Windows, определены на этапе регистрации значка приложения или его документа.
Рис. 5.2. Вид расщепленного окна с файловым деревом