讲师中心 微信公众号
AI工具推荐 视频效率加速

C++获取文件夹下所有文件名 _ filesystem库或dirent.h用法【详解】

阿辰吖_2334

阿辰吖_2334

发布时间:2026-04-08 18:19:58

|

489人浏览过

|

来源于php中文网

原创

std::filesystem 是当前 C++ 获取文件夹下所有文件名最可靠、跨平台的方式;dirent.h 仅限类 Unix 系统,Windows 下需额外兼容处理,不推荐新项目使用。

c++获取文件夹下所有文件名 _ filesystem库或dirent.h用法【详解】

用 std::filesystem 是当前 C++ 获取文件夹下所有文件名最可靠、跨平台的方式;dirent.h 仅限类 Unix 系统,Windows 下需额外兼容处理,不推荐新项目使用。

std::filesystem::directory_iterator 遍历目录(C++17 起)

这是标准、简洁、类型安全的做法。注意必须开启 C++17 或更高标准,且链接 stdc++fs(GCC)或确保 MSVC 版本支持(VS2019 v16.8+ 默认支持)。

常见错误现象:undefined reference to 'std::filesystem::directory_iterator::directory_iterator' —— 忘加链接选项;std::filesystem::directory_iterator 构造失败抛 std::filesystem::filesystem_error —— 路径不存在、无权限或不是目录。

  • 用 std::filesystem::is_regular_file() 过滤掉子目录(如只需文件名,不含子文件夹)
  • 用 entry.path().filename().string() 提取纯文件名(不含路径)
  • 若需递归遍历,请改用 std::filesystem::recursive_directory_iterator
  • 路径字符串建议用 std::filesystem::path 构造,避免手动拼接斜杠(/ vs )
#include <filesystem>
#include <iostream>
#include <vector>
<p>namespace fs = std::filesystem;</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/6e7abc4abb9f" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">C++免费学习笔记(深入)</a>”;</p><div class="aritcle_card flexRow">
                                                        <div class="artcardd flexRow">
                                                                <a class="aritcle_card_img" href="/xiazai/gongju/2823" title="C++14"><img
                                                                                src="https://img.php.cn/upload/manual/001/431/639/6ac8b33c327c4749.png" alt="C++14"  onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
                                                                <div class="aritcle_card_info flexColumn">
                                                                        <a href="/xiazai/gongju/2823" title="C++14">C++14</a>
                                                                        <p>C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。</p>
                                                                </div>
                                                                <a href="/xiazai/gongju/2823" title="C++14" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
                                                        </div>
                                                </div><p>int main() {
std::vector<std::string> filenames;
try {
for (const auto& entry : fs::directory_iterator("data/")) {
if (fs::is_regular_file(entry)) {
filenames.push_back(entry.path().filename().string());
}
}
} catch (const fs::filesystem_error& e) {
std::cerr << "fs error: " << e.what() << '
';
}
}

dirent.h 在 Linux/macOS 上的典型用法(非标准,不可跨平台)

dirent.h 是 POSIX 接口,Windows 原生不提供;MinGW 可模拟,但 MSVC 完全不支持(除非引入第三方头或改用 _findfirst)。它轻量但无类型检查,容易漏掉 . 和 .. 目录项。

常见错误现象:readdir() returns NULL but no error set —— 忘记检查 errno;DT_DIR 判断在某些旧系统上不可靠;未跳过 . 和 .. 导致逻辑异常。

  • 必须包含 <dirent.h></dirent.h> 和 <sys></sys>(如需判断类型)
  • 用 stat() + S_ISREG() 判断是否为普通文件(d_type 字段在某些文件系统中不可靠)
  • 显式跳过 entry->d_name[0] == '.' 的条目(包括 . 和 ..)
  • 记得调用 closedir(),否则资源泄漏
#include <dirent.h>
#include <sys/stat.h>
#include <vector>
#include <string>
<p>std::vector<std::string> list_files_c(const char<em> path) {
std::vector<std::string> names;
DIR</em> dir = opendir(path);
if (!dir) return names;</p><pre class="brush:php;toolbar:false;">struct dirent* entry;
while ((entry = readdir(dir)) != nullptr) {
    if (entry->d_name[0] == '.') continue; // skip . and ..
    std::string fullpath = std::string(path) + "/" + entry->d_name;
    struct stat st;
    if (stat(fullpath.c_str(), &st) == 0 && S_ISREG(st.st_mode)) {
        names.push_back(entry->d_name);
    }
}
closedir(dir);
return names;

}

Windows 下用 _findfirst/_findnext(仅 MSVC/MinGW 兼容)

这是 Windows 传统做法,比 dirent.h 更“原生”,但完全不可移植。结构体字段名(如 _finddata_t.name)和通配符语法(*.*)是硬编码习惯,容易写错。

常见错误现象:_findfirst 返回 -1 但没检查 errno;忘记用 _findclose();误把 _A_SUBDIR 当作文件类型标志(它只是属性位,需与 _A_NORMAL 组合判断)。

  • 搜索模式必须含通配符,例如 "data\*",不能只写 "data"
  • 用 file.attrib & _A_SUBDIR 判断是否为目录,而非直接比较 file.attrib == _A_SUBDIR
  • _findfirst 返回句柄,后续必须配对 _findnext + _findclose
  • 文件名字段是 file.name,不是 file.filename
#include <io.h>
#include <vector>
#include <string>
<p>std::vector<std::string> list_files_win(const char<em> path) {
std::vector<std::string> names;
std::string pattern = std::string(path) + "</em>";
_finddata_t file;
intptr_t hFile = _findfirst(pattern.c_str(), &file);
if (hFile == -1) return names;</p><pre class="brush:php;toolbar:false;">do {
    if (!(file.attrib & _A_SUBDIR)) { // not a directory
        names.push_back(file.name);
    }
} while (_findnext(hFile, &file) == 0);

_findclose(hFile);
return names;

}

真正要注意的是:std::filesystem 的路径对象在构造时会做规范化(如合并 ../),而 dirent.h 和 _findfirst 返回的都是原始目录项名称,不做路径解析。如果你依赖文件名顺序,std::filesystem::directory_iterator 不保证排序,需要手动 std::sort;而 readdir 和 _findnext 的顺序取决于文件系统底层,也不应假设有序。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

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

5999

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1678

2024.03.01

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

1138

2023.09.04

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

949

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2760

2023.10.25

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1678

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2544

2023.09.04

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

40

2026.10.10

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn