Windows 不支持 dirent.h,需用 C++17 std::filesystem::directory_iterator 替代;它跨平台、自动处理路径与编码,且无需手动管理资源。

dirent.h 在 Windows 上根本不能用
直接告诉你:Windows 默认不带 dirent.h,VS、MinGW(非 MSYS2 环境)下编译会报错 fatal error: dirent.h: No such file or directory。这不是你路径没配对,是它压根不是 Windows 原生 API 的一部分。
常见错误现象:#include <dirent.h></dirent.h> 编译失败;或用了 MinGW-w64 但忘了加 -D__USE_MINGW_ANSI_STDIO 导致 readdir() 返回乱码文件名。
- Linux/macOS 可直接用,头文件和函数都标准
- Windows 下想用,得自己引入兼容层(如 tronkko/dirent),或改用
<filesystem></filesystem>(C++17 起) - MSVC 用户别挣扎——别试图找“Windows 版 dirent.h”,那是白费时间
std::filesystem::directory_iterator 是更靠谱的跨平台选择
C++17 引入的 std::filesystem 不仅能遍历目录,还自动处理路径分隔符、编码、符号链接等脏活。它不是“替代方案”,而是当前 C++ 的事实标准。
使用场景:需要跨平台、要过滤文件类型、要获取文件大小 / 最后修改时间、不想手动管理 DIR* 生命周期。
立即学习 “C++ 免费学习笔记(深入)”;
#include <filesystem> namespace fs = std::filesystem; for (const auto& entry : fs::directory_iterator("/path/to/dir")) {if (entry.is_regular_file()) {std::cout << entry.path().filename() << "n";} }
- 注意:GCC 需加编译选项
-lstdc++fs(GCC -
directory_iterator不递归,要递归请用recursive_directory_iterator - 路径字符串建议用
fs::path构造,避免裸字符串拼接导致反斜杠转义问题
readdir() 的三个关键陷阱(Linux/macOS 下真要用)
如果你明确在 Linux/macOS 上写服务、嵌入式工具,或必须对接旧代码,readdir() 还是得懂。但它比看起来危险得多。
常见错误现象:程序随机崩溃、漏读文件、中文文件名显示为 ????、readdir() 返回 NULL 后继续解引用。
-
struct dirent*指针由readdir()内部复用,每次调用都会覆盖前次内容,不能存指针、不能跨循环迭代保存 - 文件名字段
d_name是 char 数组,长度固定(NAME_MAX),超长名会被截断,且不保证以