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

本文提供了一段使用C语言实现的递归遍历文件夹和目录的代码示例,并详细解释了其工作原理。同时,还介绍了Qt中的实现方式,包括如何处理目录遍历和文件信息收集过程中的常见问题。最后,提供了修改后的Qt函数以解决常量列表导致的递归错误。

#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;
         }
}

<think>好的,我现在需要解决用户的问题:如何在Qt遍历文件夹下的所有文件,并给出示例代码。用户已经提供了一些相关的引用内容,我需要先仔细阅读这些引用,看看有没有可以直接利用的信息。 首先,引用[1]提到使用QDir的entryList()函数获取所有文件名,然后遍历文件名列表,过滤出子文件夹。这里的关键点是entryList()entryInfoList()的使用,以及设置过滤器QDir::DirsQDir::NoDotAndDotDot来排除当前目录上级目录的符号链接。不过用户的需求是遍历所有文件,而不仅仅是子文件夹,所以可能需要调整过滤器。 引用[2]展示了如何创建文件夹,但用户的问题是关于遍历文件,这部分可能暂时用不上。不过提到的QFileInfoexists()检查可能在遍历过程中有用,比如判断是否是文件或目录。 引用[3]是关于Linux下C/C++遍历文件夹的方法,使用了opendir()等系统调用。但用户明确要求Qt的方法,所以这部分可能作为背景知识,但不需要直接使用。 引用[4]给出了一个具体的例子,路径是“D:/.../FILE”,其中包含一个A.txt文件。这可能说明用户需要处理特定路径下的所有文件,包括子目录中的文件。 接下来,我需要综合这些信息,找到Qt遍历所有文件(包括子文件夹)的正确方法。根据Qt文档,递归遍历文件夹通常需要使用递归函数,或者QDirIterator。QDirIterator可以设置QDirIterator::Subdirectories标志来遍历子目录,这可能是一个更高效的方法。 在引用[1]中,用户使用了entryInfoList()来获取文件信息列表,然后遍历每个QFileInfo对象。如果结合递归,就可以处理子文件夹中的文件。但如果是用QDirIterator的话,可能代码更简洁。 比如,使用QDirIterator的示例代码可能如下: QDirIterator it("folder_path", QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); while (it.hasNext()) { QString filePath = it.next(); QFileInfo fileInfo(filePath); // 处理文件 } 这样就能遍历所有子目录下的文件。同时需要设置过滤器为QDir::Files,并且包含QDirIterator::Subdirectories选项。另外,用户可能需要完整的文件路径,所以使用entryInfoList()或者QDirIterator的next()返回的路径是否包含完整路径需要考虑。 引用[1]中的示例代码遍历的是子文件夹,而用户需要的是所有文件,所以需要调整过滤器,将QDir::Dirs改为QDir::Files,或者同时包含两者?不,用户需要的是所有文件,包括子文件夹中的文件,所以可能需要递归遍历每个子目录,或者使用QDirIterator来简化这个过程。 另外,需要处理绝对路径还是相对路径?用户示例中的引用[4]显示的是绝对路径,所以可能需要获取文件的绝对路径,使用QFileInfo的absoluteFilePath()或者QDirIterator直接返回完整路径。 综上,正确的做法可能是使用QDirIterator,设置Subdirectories标志,并过滤文件。示例代码可能如下: QDirIterator it("folder_path", QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); while (it.hasNext()) { QString filePath = it.next(); QFileInfo fileInfo(filePath); qDebug() << "文件路径:" << fileInfo.absoluteFilePath(); } 或者,如果使用递归函数的方法,可能需要像这样: void listFilesRecursively(const QString &path) { QDir dir(path); QFileInfoList entries = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); foreach(const QFileInfo &entry, entries) { if (entry.isDir()) { listFilesRecursively(entry.absoluteFilePath()); } else { qDebug() << "文件:" << entry.absoluteFilePath(); } } } 这两种方法都可以实现遍历所有文件,包括子文件夹中的文件。用户可能需要根据具体情况选择合适的方法。QDirIterator的方法更简洁,而递归函数的方法可能在处理复杂逻辑时更灵活。 接下来,需要检查用户提供的引用是否有相关的代码。引用[1]中的代码是遍历文件夹名称,而用户需要遍历文件,所以需要调整过滤器。例如,设置QDir::Files来获取文件,或者同时包含文件目录,但需要进一步判断是否是文件。 例如,使用entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot),然后遍历每个条目,如果是目录递归处理,否则处理文件。 在示例代码中,可能需要展示这两种方法,并说明各自的优缺点。例如,QDirIterator更简单,递归方法更灵活。 现在,用户的问题是需要示例代码,因此需要给出这两种方法的代码示例,并解释各自的适用场景。同时,需要确保代码正确,符合Qt的语法用法。 最后,根据引用[1],用户可能已经了解entryInfoList的使用,所以可以结合这一点来展示递归遍历的方法。而引用[4]中的示例可能是一个简单的遍历,但没有递归处理子文件夹。 因此,正确的示例代码应该包括两种方法,并说明如何获取所有文件的路径。同时,需要处理路径的正确性,避免出现相对路径的问题。在代码中,使用QDir的绝对路径方法,如absoluteFilePath(),确保路径正确。 总结,回答应包含两种方法的示例代码:一种是使用QDirIterator,另一种是递归函数。同时,说明如何设置过滤器处理子目录,确保获取所有文件。</think>在Qt遍历文件夹下所有文件可以通过`QDirIterator`或递归函数实现。以下是两种方法的示例代码及说明: --- ### 方法一:使用QDirIterator(推荐) ```cpp #include <QDirIterator> #include <QDebug> void listAllFiles(const QString& folderPath) { QDirIterator it(folderPath, QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); // 遍历文件夹 while (it.hasNext()) { QString filePath = it.next(); QFileInfo fileInfo(filePath); qDebug() << "文件路径:" << fileInfo.absoluteFilePath(); } } ``` - **参数说明**: - `QDir::Files`: 仅遍历文件。 - `QDir::NoDotAndDotDot`: 排除`.`(当前目录`..`(上级目录)。 - `QDirIterator::Subdirectories`: 递归遍历文件夹[^1]。 - **优点**: 代码简洁,无需手动处理递归逻辑。 --- ### 方法二:递归遍历 ```cpp #include <QDir> #include <QFileInfo> #include <QDebug> void listFilesRecursively(const QString& path) { QDir dir(path); dir.setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); QFileInfoList entries = dir.entryInfoList(); for (const QFileInfo& entry : entries) { if (entry.isDir()) { listFilesRecursively(entry.absoluteFilePath()); // 递归处理子文件夹 } else { qDebug() << "文件名:" << entry.fileName() << "路径:" << entry.absoluteFilePath(); } } } ``` - **关键点**: - 使用`QDir::Files`过滤文件,`QDir::Dirs`保留文件夹以便递归。 - `entryInfoList()`获取文件信息列表。 - **优点**: 可灵活添加自定义逻辑(如过滤特定扩展名)。 --- ### 应用场景 1. **批量处理文件**: 如批量重命名、格式转换。 2. **文件搜索**: 实现类似资源管理器的搜索功能。 3. **数据统计**: 统计文件夹大小或文件数量。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值