0

0

如何在C++中遍历一个文件夹中的所有文件_C++目录文件遍历实现

冰火之心

冰火之心

发布时间:2025-09-20 08:28:01

|

877人浏览过

|

来源于php中文网

原创

C++中遍历文件夹需根据操作系统选择POSIX或Windows API方法,前者使用dirent.h读取目录项并递归处理子目录,后者通过FindFirstFile/FindNextFile实现类似功能;为避免无限循环需跳过"."和"..";可结合access()或GetFileAttributes()处理权限问题;遍历大型目录时可通过多线程、异步I/O、缓存结构和减少属性查询优化性能;过滤特定类型文件可通过检查扩展名实现,如使用rfind()提取后缀匹配.txt文件。

如何在c++中遍历一个文件夹中的所有文件_c++目录文件遍历实现

C++中遍历文件夹,核心在于利用系统提供的API来读取目录结构,并逐一处理找到的文件或子目录。这需要用到一些特定的头文件和函数,比如

(在POSIX系统上)或者Windows API中的相关函数。

解决方案:

在C++中遍历一个文件夹中的所有文件,可以使用不同的方法,取决于你的操作系统和需求。这里提供两种常见的方法:一种使用POSIX标准(适用于Linux和macOS),另一种使用Windows API。

1. 使用POSIX标准(dirent.h):

立即学习C++免费学习笔记(深入)”;

#include 
#include 
#include 
#include 
#include 

void traverseDirectory(const std::string& dirPath) {
    DIR *dir;
    struct dirent *ent;
    if ((dir = opendir(dirPath.c_str())) != NULL) {
        while ((ent = readdir(dir)) != NULL) {
            if (strcmp(ent->d_name, ".") != 0 && strcmp(ent->d_name, "..") != 0) {
                std::cout << dirPath << "/" << ent->d_name << std::endl;
                // 检查是否为目录,如果是,则递归调用
                std::string fullPath = dirPath + "/" + ent->d_name;
                DIR *subdir = opendir(fullPath.c_str());
                if (subdir != NULL) {
                    closedir(subdir);
                    traverseDirectory(fullPath);
                }
            }
        }
        closedir(dir);
    } else {
        perror("Could not open directory");
    }
}

int main() {
    std::string directoryPath = "/path/to/your/directory"; // 替换为你的目录路径
    traverseDirectory(directoryPath);
    return 0;
}

这段代码首先尝试打开指定的目录。如果成功,它会循环读取目录中的每一个条目。

readdir
函数返回一个
dirent
结构体,其中包含了条目的名称。为了避免无限循环,代码会跳过
.
(当前目录)和
..
(父目录)这两个特殊条目。对于每一个非特殊条目,代码会打印出它的完整路径。此外,代码会检查该条目是否为目录,如果是,则递归调用
traverseDirectory
函数来遍历该子目录。如果目录无法打开,代码会打印出一个错误信息。

2. 使用Windows API:

#include 
#include 
#include 
#include 

void traverseDirectory(const std::string& dirPath) {
    std::string searchPath = dirPath + "\\*";
    WIN32_FIND_DATA findData;
    HANDLE hFind = FindFirstFile(searchPath.c_str(), &findData);

    if (hFind == INVALID_HANDLE_VALUE) {
        std::cerr << "FindFirstFile failed (" << GetLastError() << ")" << std::endl;
        return;
    }

    do {
        if (strcmp(findData.cFileName, ".") != 0 && strcmp(findData.cFileName, "..") != 0) {
            std::string fullPath = dirPath + "\\" + findData.cFileName;
            std::cout << fullPath << std::endl;

            if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
                traverseDirectory(fullPath); // 递归调用
            }
        }
    } while (FindNextFile(hFind, &findData) != 0);

    FindClose(hFind);
}

int main() {
    std::string directoryPath = "C:\\path\\to\\your\\directory"; // 替换为你的目录路径
    traverseDirectory(directoryPath);
    return 0;
}

这段Windows代码首先构造一个搜索路径,该路径包含了目录路径和一个通配符

\*
,用于匹配目录中的所有文件和子目录。然后,它使用
FindFirstFile
函数来开始搜索。如果搜索成功,它会循环调用
FindNextFile
函数来获取目录中的每一个条目。与POSIX示例类似,代码会跳过
.
..
这两个特殊条目。对于每一个非特殊条目,代码会打印出它的完整路径。此外,代码会检查该条目是否为目录,如果是,则递归调用
traverseDirectory
函数来遍历该子目录。最后,代码使用
FindClose
函数来关闭搜索句柄。

如何处理遍历过程中遇到的权限问题?

易森网络企业版
易森网络企业版

如果您是新用户,请直接将本程序的所有文件上传在任一文件夹下,Rewrite 目录下放置了伪静态规则和筛选器,可将规则添加进IIS,即可正常使用,不用进行任何设置;(可修改图片等)默认的管理员用户名、密码和验证码都是:yeesen系统默认关闭,请上传后登陆后台点击“核心管理”里操作如下:进入“配置管理”中的&ld

下载

处理权限问题通常需要结合操作系统提供的权限管理机制。在POSIX系统中,可以使用

access()
函数来检查当前用户是否具有读取、写入或执行某个文件的权限。在Windows系统中,可以使用
GetFileAttributes()
函数来获取文件的属性,并检查是否设置了只读属性。如果在遍历过程中遇到权限不足的错误,可以尝试以管理员权限运行程序,或者修改文件的权限设置。

遍历大型目录时,如何优化性能?

遍历大型目录时,性能瓶颈通常在于磁盘I/O。为了优化性能,可以考虑以下几种方法:

  • 使用多线程: 将目录分割成多个子目录,并使用多个线程同时遍历这些子目录。
  • 使用异步I/O: 使用异步I/O操作可以避免阻塞主线程,从而提高程序的响应速度。
  • 缓存目录结构: 将目录结构缓存到内存中,可以减少磁盘I/O的次数。
  • 避免不必要的文件属性查询: 尽量避免在遍历过程中查询文件的属性,除非确实需要这些信息。

如何过滤特定类型的文件?

在遍历目录时,经常需要过滤掉特定类型的文件,只处理感兴趣的文件。这可以通过检查文件的扩展名来实现。在POSIX系统中,可以使用

std::string::rfind()
函数来查找文件名的最后一个
.
字符,然后提取扩展名并进行比较。在Windows系统中,可以使用
PathFindExtension()
函数来获取文件的扩展名。

例如,只处理

.txt
文件的POSIX代码:

#include 
#include 
#include 
#include 
#include 

void traverseDirectory(const std::string& dirPath) {
    DIR *dir;
    struct dirent *ent;
    if ((dir = opendir(dirPath.c_str())) != NULL) {
        while ((ent = readdir(dir)) != NULL) {
            if (strcmp(ent->d_name, ".") != 0 && strcmp(ent->d_name, "..") != 0) {
                std::string filename = ent->d_name;
                size_t dotPos = filename.rfind(".");
                if (dotPos != std::string::npos && filename.substr(dotPos + 1) == "txt") {
                    std::cout << dirPath << "/" << ent->d_name << std::endl;
                }
                // 检查是否为目录,如果是,则递归调用
                std::string fullPath = dirPath + "/" + ent->d_name;
                DIR *subdir = opendir(fullPath.c_str());
                if (subdir != NULL) {
                    closedir(subdir);
                    traverseDirectory(fullPath);
                }
            }
        }
        closedir(dir);
    } else {
        perror("Could not open directory");
    }
}

int main() {
    std::string directoryPath = "/path/to/your/directory"; // 替换为你的目录路径
    traverseDirectory(directoryPath);
    return 0;
}

这段代码在打印文件路径之前,会先检查文件的扩展名是否为

.txt
。只有当扩展名匹配时,才会打印文件路径。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

193

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

185

2025.07.04

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

469

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

106

2025.12.24

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

106

2025.12.24

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

513

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1049

2023.07.27

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 1.9万人学习

ThinkPHP6.x API接口--十天技能课堂
ThinkPHP6.x API接口--十天技能课堂

共14课时 | 1.1万人学习

微信小程序开发--云开发篇
微信小程序开发--云开发篇

共15课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号