您可以使用QDirIterator一次遍历一个目录。它类似于QDir::entryList()和QDir::entryInfoList(),但因为它一次只列出一个条目,而不是一次列出所有条目,它的扩展性更好,更适合大目录。之前我们看到很多用递归的方式进行遍历的,用迭代器方法的效率
用法一:列举全部文件(不包含链接)
QString path = "目标路径";
QDirIterator iter(path,
QDir::Files | QDir::NoSymLinks,
QDirIterator::Subdirectories);
while(iter.hasNext())
{
iter.next();
qDebug() << "fileName:" << iter.fileName(); // 只有文件名
qDebug() << "filePath:" << iter.filePath(); //包含文件名的文件的全路径
QFileInfo fileInfo = iter.fileInfo();
QString absoluteFilePath = fileInfo.absoluteFilePath(); //这个和iter.filePath()结果一样
qDebug() << "absoluteFilePath:" << absoluteFilePath;
}
用法二:获取某目录下的某类型文件(这里用*.jpg,*.png图片来举例说明)
QString path = "目标路径";
QDirIterator iter(path, QStringList() << "*.jpg" << "*.png",
QDir::Files | QDir::NoSymLinks,
QDirIterator::Subdirectories);
while(iter.hasNext())
{
iter.next();
qDebug() << "filePath:" << iter.filePath(); //包含文件名的文件的全路径
}
Qt帮助文档了的该类的公有函数
QDirIterator(const QString &path, const QStringList &nameFilters, QDir::Filters filters = QDir::NoFilter, QDirIterator::IteratorFlags flags = NoIteratorFlags)
QDirIterator(const QString &path, QDir::Filters filters, QDirIterator::IteratorFlags flags = NoIteratorFlags)
QDirIterator(const QString &path, QDirIterator::IteratorFlags flags = NoIteratorFlags)
QDirIterator(const QDir &dir, QDirIterator::IteratorFlags flags = NoIteratorFlags)
~QDirIterator()
QFileInfo fileInfo() const
QString fileName() const
QString filePath() const
bool hasNext() const
QString next()
QString path() const
QString fileName() const
该函数返回的只是文件名,比如1.txt
QString filePath() const
该函数返回文件的全路径,比如D:/test/sub/1.txt
QString path() const
文档是这样说的:Returns the base directory of the iterator.
这个返回的每次都一样,就是你搜索的目录路径,在构造函数里传入的第一个参数,就是它了。
经个人测试,该方法的效率和递归的效率是一样的,可以放心地用。
参考文档:
Qt 遍历文件夹的三种方式
QDirIterator QT遍历目录文件,包括子文件(记录自己获取文件显示不完全的问题)
QT 读取文件夹下所有文件(超级简单的方法,不需要QDirIterator)