Ранее я уже писал о рекурсивном поиске файлов на 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();
}
}
|
|
Webmoney Z163628999150, R617151845974
|