Search code examples
pythonqtpyqtqtcoreqfile

os.walk analogue in PyQt


Before I can continue to implement recursive dir/file search with some filtering for some tasks I want to know if Qt/PyQt has analogue of os.walk.

Main app is a GUI app in PyQt4 and all text fields in a QStrings and path objects (files, directories) uses QFile, QDir, QFileinfo for manipulations.

As analogue I mean fast and convenient recursive fs-tree traversal tool.

Should I use os.walk or something much faster and more informative?

PS. Maybe this can help me but I'm not sure if this more efficient than os.walk.


Solution

  • Should I use os.walk or something much faster and more informative?

    There is none, and I would recommend using os.walk in python if you can. It is just as good as it gets.

    It is not only because Qt does not have such a convenience method, but even if you write your own mechanism based on QDir, you will have access to all the three variables without hand-crafting like with os.walk.

    If you are desperate about using Qt, then you could have the following traverse function below I used myself a while ago.

    main.cpp

    #include <QDir>
    #include <QFileInfoList>
    #include <QDebug>
    
    void traverse( const QString& dirname )
    {
        QDir dir(dirname);
        dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoSymLinks | QDir::NoDot | QDir::NoDotDot);
    
        foreach (QFileInfo fileInfo, dir.entryInfoList()) {
          if (fileInfo.isDir() && fileInfo.isReadable())
              traverse(fileInfo.absoluteFilePath());
          else
              qDebug() << fileInfo.absoluteFilePath();
        }
    }
    
    int main()
    {
        traverse("/usr/lib");
        return 0;
    }
    

    or simply the following forfor large directories and in general since it scales better and more convenient:

    #include <QDirIterator>
    #include <QDebug>
    
    int main()
    {
        QDirIterator it("/etc", QDirIterator::Subdirectories);
        while (it.hasNext())
            qDebug() << it.next();
        return 0;
    }
    

    main.pro

    TEMPLATE = app
    TARGET = qdir-traverse
    QT = core
    SOURCES += main.cpp
    

    Build and Run

    qmake && make && ./qdir-traverse
    

    Then, you will get all the traversed files printed. You can start customizing it then further to your needs.