| |
Класс QDir дает возможность навигации по файловой системе и получать информацию о файлах, независимо от типа операционной системы. Чтобы показать некоторые особенности класса QDir, напишем небольшое консольное приложение, которое подсчитывает суммарный объем всех файлов с изображениями в заданном каталоге и вложенных подкаталогах.
Основу приложения составляет функция imageSpace(), которая суммирует размеры файлов в заданном каталоге:
int imageSpace(const QString &path) { QDir dir(path); QStringList::Iterator it; int size = 0; QStringList files = dir.entryList("*.png *.jpg *.jpeg", QDir::Files); it = files.begin(); while (it != files.end()) { size += QFileInfo(path, *it).size(); ++it; } QStringList dirs = dir.entryList(QDir::Dirs); it = dirs.begin(); while (it != dirs.end()) { if (*it != "." && *it != "..") size += imageSpace(path + "/" + *it); ++it; } return size; }Начинается она с создания экземпляра класса QDir, с заданным полным именем каталога. Затем вызывается функция entryList(), которой передаются два аргумента. Первый из них -- это список шаблонов имен файлов, разделенных пробелами. В шаблонах допускается указывать символы подстановки '*' и '?'. В данном примере будут учитываться только файлы изображений, в форматах JPEG и PNG. Второй аргумент определяет тип элементов результирующего списка (обычные файлы, каталоги, устройства и пр.).
Затем, в цикле, осуществляется проход по списку файлов и суммируются их размеры. Класс QFileInfo позволяет получить доступ к таким характеристикам файла, как размер, права доступа, владелец и время (создания, последнего обращения, последнего изменения).
Вторым обращением к entryList() создается список вложенных подкаталогов. После чего, в цикле, выполняется проход по подкаталогам, с рекурсивным вызовом imageSpace() для каждого из них.
Полный путь к вложенным подкаталогам "собирается" из полного пути к текущему каталогу, символа слэша и имени подкаталога (*it). Класс QDir интерпретирует символ "/" как разделитель имен каталогов независимо от используемой операционной системы. Перед выводом полного пути перед пользователем, можно вызвать функцию QDir::convertSeparators(), которая преобразует символ "/" в корректное представление, в зависимости от используемой платформы.
Добавим в нашу программу функцию main():
int main(int argc, char *argv[]) { QString path = QDir::currentDirPath(); if (argc > 1) path = argv[1]; cerr << "Space used by images in " << endl << path.ascii() << endl << "and its subdirectories is " << (imageSpace(path) / 1024) << " KB" << endl; return 0; }В этом примере мы не создавали объект класса QApplication, потому что мы воспользовались только инструментальными классами, не имеющими отношения к графическому интерфейсу. Полный список таких классов вы найдете по адресу: http://doc.trolltech.com/3.2/tools.html.
Для начальной инициализации переменной path была использована функция QDir::currentDirPath(), которая возвращает полное имя текущего каталога. В качестве альтернативы можно было бы использовать функцию QDir::homeDirPath(), возвращающую полный путь к домашнему каталогу пользователя. Если путь к каталогу задается пользователем из командной строки, то он замещает значение по-умолчанию. В заключение вызывается функция imageSpace(), которая подсчитывает суммарный размер всех файлов с изображениями.
Класс QDir предоставляет ряд других функций, для работы с каталогами и файлами, среди них: rename(), exists(), mkdir() и rmdir().
Пред. | В начало | След. |
Чтение и запись текста. | На уровень выше | Взаимодействия между процессами. |
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |