QT的QDir的目录操作可以很丰富,创建,删除,增加,等等,可以通过简单的结构直接调用就能够作用这些很常见的操作。
这篇主要记录一下遍历文件,是全部遍历不是说通过entryInfoList成员,遍历执行文件夹的一层,而是所有的遍历。
1、使用深度寻路的逻辑来进行全部遍历,在遍历到文件夹的时候递归继续遍历,但是注意里面的条件要记得设置,如果不设置条件,在遍历的时候会有'.'和'..'这两个文件夹,能继续打开和遍历,但是在资源管理器中看不到,不算我们的文件夹,不要.和..这个两个东西
void dirPath(const QString&filePath)
{
QDir dir(filePath);
foreach (QFileInfo item,dir.entryInfoList(QDir::AllDirs|QDir::Files|QDir::NoDotAndDotDot))
{
if(item.isDir())
{
dirPath(item.filePath());
qDebug()<<item.filePath();
}
else if(item.isFile())
{
qDebug()<<item.filePath();
}
}
}
2、使用广度遍历的逻辑来进行遍历
QStringList downPath; //当前要遍历的文件夹
QStringList nextPaht; //下次要遍历的文件夹
downPath<<"D:/"; //当前要遍历的文件夹
while(1)
{
for(int i=0;i<downPath.size();i++)
{
QDir dir(downPath[i]); //当前要遍历的文件夹
QFileInfoList fileinfolist=dir.entryInfoList(QDir::NoDotAndDotDot|QDir::AllDirs|QDir::Files);
for(int i=0;i<fileinfolist.size();i++)
{
if(fileinfolist[i].isFile())
qDebug()<<fileinfolist[i].filePath();
else if(fileinfolist[i].isDir())
{
nextPaht.push_back(fileinfolist[i].filePath()); //下一次要遍历的文件夹
qDebug()<<fileinfolist[i].filePath();
}
}
}
if(!nextPaht.size())
break;
downPath=nextPaht;//获取下一次要遍历的文件夹
nextPaht.clear(); //需要清掉,要保留下一次的文件夹
}
3、QDirIterator类为目录条目列表提供了一个迭代器。所以可以通过这个类来进行遍历
里面的条件要注意,QDirIterator::Subdirectories这个要有
QDir::AllEntries 列出目录、文件、驱动器和符号链接,还是不要.和..,切记
QDir::Hidden隐藏文件,自己看情况来,还有其他的一些条件,自己看看帮助文档
QStringList::const_iterator it;
QStringList begPath;
begPath<<"D:/";
for(it=begPath.constBegin();it!=begPath.constEnd();it++)
{
QDirIterator dirit(*it,QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden,QDirIterator::Subdirectories);
while(dirit.hasNext())
{
QString filePath=dirit.next();
qDebug()<<filePath;
}
}