方法一
使用类QDirIterator
来进行遍历。简介
大概是说,适合于大目录遍历,支持递归但是不支持排序。
有四个重载通常使用第一个重载,path 代表路径;nameFilters 名称过滤(QstringList() 代表没有名称过滤);filters 过滤 是否列出 快捷方式,是否列出 文件夹等。iteratorFlags 是否对子目录进行递归。举例
QDirIterator dirIterator(QStringLiteral("D:/新建文件夹"), QStringList(), QDir::NoDotAndDotDot | QDir::NoSymLinks | QDir::Files, QDirIterator::Subdirectories);
没有名称过滤,不列出 . 和 … 不列出 符号链接;列出文件。递归子文件。
QDirIterator dirIterator(QStringLiteral("D:/新建文件夹"), QStringList(), QDir::NoDotAndDotDot | QDir::NoSymLinks | QDir::Files | QDir::Dirs, QDirIterator::Subdirectories);
没有名称过滤,不列出 . 和 … 不列出 符号链接;列出文件和目录。递归子文件
代码
QDirIterator dirIterator(QStringLiteral("D:/新建文件夹"), QStringList(), QDir::NoDotAndDotDot | QDir::NoSymLinks | QDir::Files | QDir::Dirs, QDirIterator::Subdirectories);
while(dirIterator.hasNext()){
dirIterator.next();
qDebug() << dirIterator.fileInfo().absoluteFilePath();
}
方法二
使用QDir
类的 entryInfoList
这个比较强大,可以指明要遍历的文件名,以及遍历的标准和排序功能。至于entryInfoList
和entryList
他们的关系是entryInfoList
返回的是QFileInfoList
我们一般使用前者,因为QFileInfo
有很多方便的接口。
举例 获取某个文件夹下的所有文件不包括文件夹不进行递归并按照修改时间进行排序
void sortAllFilesByModifyTime(const QString &dirPath, QStringList &fileList)
{
QDir dir(dirPath);
QFileInfoList list = dir.entryInfoList(QStringList(), QDir::NoSymLinks | QDir::NoDotAndDotDot | QDir::Files, QDir::SortFlag::Time);
for(const QFileInfo &fileInfo : list){
fileList.append(fileInfo.absoluteFilePath());
}
}
举例:获取一个文件夹下所有文件和目录并进行递归操作
代码
void getAllFiles(const QString &dirPath, QStringList &fileList)
{
QDir dir(dirPath);
QFileInfoList list = dir.entryInfoList(QStringList(), QDir::NoSymLinks | QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs, QDir::SortFlag::Time);
for(const QFileInfo &fileInfo : list){
if(fileInfo.isDir()){
fileList.append(fileInfo.absoluteFilePath()); //即是这里 fileInfo.isDir() 为真 也要使用 fileInfo.absoluteFilePath()而不是 fileInfo.absolutePath()
getAllFiles(fileInfo.absoluteFilePath(), fileList);
}else{
fileList.append(fileInfo.absoluteFilePath());
}
}
}
使用nameFilters
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;
}