Класс 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().
Пред. | В начало | След. |
Чтение и запись текста. | На уровень выше | Взаимодействия между процессами. |