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 QString
s 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
.
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.
来源:https://stackoverflow.com/questions/21981004/os-walk-analogue-in-pyqt