使用类QDirIterator
来进行遍历。简介
大概是说,适合于大目录遍历,支持递归但是不支持排序。
QDirIterator::NoIteratorFlags
默认值,没有标志,迭代器将返回path
符合QDir::Filters
的条目。
QDirIterator::Subdirectories
同时列出所有子文件下符合QDir::Filters
规则的条目
QDirIterator it(dirPath, QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot | QDir::AllDirs);
返回目录下的所有文件和子文件目录,不包括文件链接和.
..
QDirIterator it(dirPath, QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot);
返回目录下所有文件(此时没有子文件文件目录),不包括文件链接和.
..
void Widget::on_pushButton_clicked()
{
QStringList list;
QString dirPath = "F:\\dirTest";
QDirIterator it(dirPath, QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot | QDir::AllDirs, QDirIterator::Subdirectories);
while(it.hasNext())
{
it.next();
if(it.fileInfo().suffix() == "icd")
{
list.append(it.fileInfo().absoluteFilePath());
}
}
foreach(QString str, list)
{
qDebug() << str;
}
}
输出
"F:/dirTest/nihao/qunimade/max.icd"
"F:/dirTest/nihao/明天.icd"
"F:/dirTest/tayehao/nihao.icd"
"F:/dirTest/wobuhao.icd"
使用QDir
类的 entryInfoList
这个比较强大,可以指明要遍历的文件名,以及遍历的标准和排序功能。至于entryInfoList
和entryList
他们的关系是entryInfoList
返回的是QFileInfoList
我们一般使用前者,因为QFileInfo
有很多方便的接口。
1.如何让entryInfoList
返回所有的条目(包括子文件夹下的条目),至少需要指明QDir::AllDirs
。只是文档并没有直说的地方(至少我觉得)。
2.默认参数 Filters filters = NoFilter
并不是说什么都不列出。而是
A default constructed QDir will not filter out files based on their permissions, so entryList() and entryInfoList() will return all files that are readable, writable, executable, or any combination of the three. This makes the default easy to write, and at the same time useful.
会返回可读或可写或可执行。或者符合这三个任意组合的文件或文件目录条目。
void Widget::getAllFiles(const QString &dirPath)
{
QDir dir(dirPath);
QFileInfoList list = dir.entryInfoList(QDir::Files | QDir::AllDirs | QDir::NoSymLinks | QDir::NoDotAndDotDot);
foreach(QFileInfo fileInfo, list)
{
if(fileInfo.isDir())
{
getAllFiles(fileInfo.absoluteFilePath());
}
else
{
fileList.append(fileInfo.absoluteFilePath());
}
}
}
输出
"F:/dirTest/nihao/qunimade/max.icd"
"F:/dirTest/nihao/明天.icd"
"F:/dirTest/tayehao/nihao.icd"
"F:/dirTest/wobuhao.icd"
QDirIterator
构造函数参数 nameFilters 是可以支持一些简单的正则表达式的。就上面的例子(寻找某一个文件下说有以.icd
)结尾的文件还可以这样写。
QString dirPath = "F:\\dirTest";
QStringList list;
QDirIterator it(dirPath, QStringList() << "*.icd", QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
while(it.hasNext())
{
it.next();
list.append(it.fileInfo().absoluteFilePath());
}
foreach(QString str, list)
{
qDebug() << str;
}
输出
"F:/dirTest/nihao/qunimade/max.icd"
"F:/dirTest/nihao/明天.icd"
"F:/dirTest/tayehao/nihao.icd"
"F:/dirTest/wobuhao.icd"
修改为
QDirIterator it(dirPath, QStringList() << "*hao.icd", QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
输出
"F:/dirTest/tayehao/nihao.icd"
"F:/dirTest/wobuhao.icd"