您的位置:首页 > 编程语言 > Qt开发

Qt实现遍历文件夹和文件目录(递归)

2012-11-13 15:16 726 查看
#include <unistd.h>

#include <stdio.h>

#include <dirent.h>

#include <string.h>

#include <sys/stat.h>

#include <stdlib.h>

void printdir(char *dir, int depth)

{

DIR *dp; //定义一个子目录流

struct dirent *entry; //定义一个目录数据项,存储对目录流访问得数据

struct stat statbuf;

if((dp=opendir(dir))==NULL) //打开并创建一个子目录流

{

fprintf(stderr,"Cannot open directory:%s\n",dir);

return;

}

chdir(dir); //将当前目录跳转到dir目录中

while((entry=readdir(dp))!=NULL) //取得目录流里的下一个目录项

{

lstat(entry->d_name,&statbuf); //由目录项获得目录状态

if(S_ISDIR(statbuf.st_mode)) //判断是否为一个目录

{

if(strcmp(".",entry->d_name)==0 || strcmp("..",entry->d_name)==0)

continue;

printf("%*s%s/\n",depth,"",entry->d_name);

printdir(entry->d_name,depth+4); //递归显示子目录项

}

else

printf("%*s%s\n",depth,"",entry->d_name); //是文件,显示文件名

}

chdir(".."); //向上一级目录

closedir(dp);

}

main()

{

printf("Directory scan");

printdir("/home",0);

printf("done. \n");

exit(0);

}

这个是书上的示例,可以实现

以下是Qt中的实现算法

Qt实现遍历文件夹和文件目录(递归)

2010/03/12 11:56

bool FindFile(const QString & path)

{

QDir dir(path);

if (!dir.exists())

return false;

dir.setFilter(QDir::Dirs|QDir::Files);

dir.setSorting(QDir::DirsFirst);

QFileInfoList list = dir.entryInfoList();

Qstringlist list = dir.entryList();

int i=0;

do{

QFileInfo fileInfo = list.at(i);

if(fileInfo.fileName()=="."|fileInfo.fileName()=="..")

{

i++;

continue;

}

bool bisDir=fileInfo.isDir();

if(bisDir)

{

nFiles++;

std::cout << qPrintable(QString("%1 %2 %3").arg(fileInfo.size(), 10)

.arg(fileInfo.fileName(),10).arg(fileInfo.path()))<<endl;

FindFile(fileInfo.filePath());

}

else{

nFiles++;

std::cout << qPrintable(QString("%1 %2 %3").arg(fileInfo.size(), 10)

.arg(fileInfo.fileName(),10).arg(fileInfo.path()))<<endl;

}

i++;

}

while(i<list.size());

return true;

但这个程序中的QFileInfoList list 会出现const类型转换错误,在实现中会因list常量导致无法递归深入,注意要使用entryList()函数返回Qstringlist类型,然后Qstring进行操作,修改相应的地方,之后操作成功。

以下是修改后的函数:

void ListBox::tree(QString odir)

{

QDir dir(odir);

QStringList dires=dir.entryList(QDir::Dirs,QDir::Name);

if(!(dires.isEmpty()))

{

std::cout<<"dir is not empty" <<std::endl;

QStringList::Iterator dit=dires.begin();

while(dit!=dires.end())

{

if((*dit==".")||(*dit=="..")) ;

else{

QString m=odir+*dit+"/";

std::cout<<m<<std::endl;

tree(m);

}

++dit;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: