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

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();
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;
}

 

 

 

详细描述

QDir类提供了访问目录结构和它们的内容的与平台无关的方式。

QDir用来操作路径名称、关于路径和文件的访问信息和操作底层文件系统。

QDir使用相对或绝对文件路径来指向一个文件。绝对路径是从目录分隔符“/”或者带有一个驱动器标识(除了在Unix下)。如果你总是使用“/”作为目录分隔符,Qt将会把你的路径转化为符合底层的操作系统的。相对文件名是由一个目录名称或者文件名开始并且指定一个相对于当前路径的路径。

“当前”路径是指应用程序的工作目录。QDir自己的路径可以通过setPath()设置并且通过path()获得。

一个绝对路径的实例是字符串“/tmp/quartz”,相对路径看起来像是“src/fatlib”。你可以使用函数isRelative()来检查一个QDir使用的是相对还是绝对文件路径。调用convertToAbs()可以把一个相对的QDir转化为绝对的。使用cleanDirPath()可以得到一个简化的路径。为了获得没有符号连接或者多余的“..”元素的路径,请使用canonicalPath()。路径可以通过setPath()设置,或者使用cd()和cdUp()来改变。

QDir提供了几个静态函数,例如,setCurrent()设置应用程序的工作目录并且currentDirPath()来获得应用程序的工作目录。访问一些普通的路径是由以下一些静态函数提供的,current()、home()和root()返回QDir对象或者currentDirPath()、homeDirPath()和rootDirPath()返回字符串路径。

count()返回目录中的条目数量。通过entryList()可以获得目录中的所有文件和目录的名称的字符串列表。如果你希望得到QFileInfo指针的列表请使用entryInfoList()。这些函数都可以使用名称过滤器、属性过滤器(例如只读、只要文件不要目录等等)和排列顺序。过滤器和排序可以调用setNameFilter()、setFilter()和setSorting()来设置。它们可以通过entryList()和entryInfoList()的参数来指定。

mkdir()可以创建一个新目录,rename()可以重命名一个目录并且rmdir()可以移除一个已经存在的目录。remove()可以移除一个已经存在的文件。你可以通过exists()、isReadable()和isRoot()来询问一个目录。

使用filePath()可以得到一个带有文件名的路径,并且dirName()可以得到目录名称,这两个函数都不能检测文件或者目录是否存在。

drives()提供根目录的列表,在Unix系统上,这个返回一个只包含根目录“/”的列表,在Windows上,这个列表将包含“C:/”并且还有“D:/”等等。

如果你需要一个适应底层操作系统形式的路径,请使用convertSeparators()。

实例:

请参考一个目录是否存在。

    QDir d( "example" );                        // “./example”
    if ( !d.exists() )
        qWarning( "Cannot find the example directory" );
  

Traversing directories and reading a file.

    QDir d = QDir::root();                      // “/”
    if ( !d.cd("tmp") ) {                       // “/tmp”
        qWarning( "Cannot find the \"/tmp\" directory" );
    } else {
        QFile f( d.filePath("ex1.txt") );       // “/tmp/ex1.txt”
        if ( !f.open(IO_ReadWrite) )
            qWarning( "Cannot create the file %s", f.name() );
    }
  

一个列出当前目录中所有文件(不包括符号连接)的程序,按大小排序,小的在前。

    #include <stdio.h>
    #include <qdir.h>

    int main( int argc, char **argv )
    {
        QDir d;
        d.setFilter( QDir::Files | QDir::Hidden | QDir::NoSymLinks );
        d.setSorting( QDir::Size | QDir::Reversed );

        const QFileInfoList *list = d.entryInfoList();
        QFileInfoListIterator it( *list );
        QFileInfo *fi;

        printf( "     Bytes Filename\n" );
        while ( (fi = it.current()) != 0 ) {
            printf( "%10li %s\n", fi->size(), fi->fileName()。latin1() );
            ++it;
        }
        return 0;
    }
<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. **数据统计**: 统计文件夹大小或文件数量。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值