Рекурсивный поиск файлов на Qt

Ранее я уже писал о рекурсивном поиске файлов на WinAPI. Вот кроссплатформенная реализация на Qt.
Мне известны два способа рекурсивно искать файлы во вложенных подпапках с помощью Qt:
1. С помощью стандартного рекурсивного вызова функции чтения содержимого папок;
2. С помощью класса QDirIterator.

Функция, представленная ниже, ищет и выводит на экран имена файлов в текущем каталоге, а если находит каталог, то входит в него и отображает содержимое этого каталога, и так далее.

void ListDirRecursive(QString directory)
{
 QDir dir(directory);
 foreach(QString entry, dir.entryList())
 {
 if ((entry == ".") || (entry == ".."))
 continue;
 QDir subdir = QDir(dir.absoluteFilePath(entry));
 if (subdir.exists())
 ListDirRecursive(subdir.absolutePath());
 qDebug() << subdir.absolutePath();
 }
}

Более элегантный способ искать файлы во вложенных каталогах — использовать класс QDirIterator.
В качестве входных параметров классу QDirIterator можно передать начальный каталог, с которого нужно начинать перечислять вложенные файлы, фильтр файлов для поиска и дополнительные флаги.
Фильтр файлов указывается по аналогии с классом QDir. В примере ниже QDir::Files | QDir::NoSymLinks означает, что нужно искать файлы и не отображать символьные ссылки.
Дополнительные флаги могут быть следующими:
QDirIterator::NoIteratorFlags — стандартный флаг, обозначающий отсутствие флагов;
QDirIterator::Subdirectories — флаг, указывающий, что нужно перечислять файлы и в подпапках;
QDirIterator::FollowSymlinks — флаг указывает, что символьные ссылки тоже нужно обрабатывать.

Так выглядит функция, которая рекурсивно ищет файлы в подкаталогах с использованием класса QDirIterator:

void ListDirRecursive2(QString directory)
{
 QDirIterator iterator (directory, QDir::Files | QDir::NoSymLinks, QDirIterator::Subdirectories);
 while(iterator.hasNext())
 {
 iterator.next();
 qDebug() << iterator.fileInfo().absoluteFilePath();
 }
}

Поблагодарить автора

Оставить комментарий

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>