The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Каталог документации / Раздел "Программирование, языки" / Оглавление документа

10.3. Работа с файлами и каталогами.

Класс 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().




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру