c++qt

Recursively iterate over all the files in a directory and its subdirectories in Qt


I want to recursively scan a directory and all its sub-directories for files with a given extension - for example, all *.jpg files. How can you do that in Qt?


Solution

  • NOTE: From Qt 6.8, QDirListing is preferred.

    I suggest you have a look at QDirIterator.

    QDirIterator it(dir, QStringList() << "*.jpg", QDir::Files, QDirIterator::Subdirectories);
    while (it.hasNext())
        qDebug() << it.next();
    

    You could simply use QDir::entryList() recursively, but QDirIterator is simpler. Also, if you happen to have directories with a huge amount of files, you'd get pretty large lists from QDir::entryList(), which may not be good on small embedded devices.

    Example (dir is QDir::currentPath()):

    luca @ ~/it_test - [] $ tree
    .
    ├── dir1
    │   ├── image2.jpg
    │   └── image3.jpg
    ├── dir2
    │   └── image4.png
    ├── dir3
    │   └── image5.jpg
    └── image1.jpg
    
    3 directories, 5 files
    luca @ ~/it_test - [] $ /path/to/app
    "/home/luca/it_test/image1.jpg"
    "/home/luca/it_test/dir3/image5.jpg"
    "/home/luca/it_test/dir1/image2.jpg"
    "/home/luca/it_test/dir1/image3.jpg"