C++17起推荐用std::filesystem::recursive_directory_iterator递归遍历,它自动跳过符号链接循环、无需手写递归,但需try-catch捕获filesystem_error,用is_regular_file()过滤文件,并注意编译链接要求。用 std::filesystem::recursive_directory_iterator 遍历最直接C++17 起,std::filesystem 是标准方案,不用依赖 Boost 或系统 API。它天然支持递归遍历,且自动跳过循环符号链接(默认行为),比手写递归或调用 FindFirstFile / opendir 更可靠。常见错误是误用 directory_iterator(非 recursive 版)——它只扫一层,漏掉子目录里的文件;或者没处理异常,遇到权限不足的目录(如 /proc 下某些条目)直接崩溃。必须加 #include <filesystem></filesystem>,并链接 -lstdc++fs(GCC 早期版本)或启用 C++17 标准(-std=c++17)遍历时用 try-catch 包住迭代器递增操作,捕获 std::filesystem::filesystem_error用 is_regular_file() 过滤,排除目录、socket、设备文件等int count_files(const std::string& path) { int cnt = 0; try { for (const auto& entry : std::filesystem::recursive_directory_iterator(path)) { if (entry.is_regular_file()) ++cnt; } } catch (const std::filesystem::filesystem_error& e) { // 忽略无权限目录,不中断计数 } return cnt;}Windows 下用 FindFirstFileExW 需手动递归,容易栈溢出如果项目不能用 C++17,又必须纯 Win32,就得自己实现递归。但直接深度优先易触发栈溢出(极深目录树),且 FindFirstFile 不区分文件/目录,得靠 FILE_ATTRIBUTE_DIRECTORY 判断。关键陷阱是:忽略 FILE_ATTRIBUTE_REPARSE_POINT 可能陷入符号链接死循环;不跳过 "." 和 ".." 会导致重复计数甚至无限递归。立即学习“C++免费学习笔记(深入)”;必须检查 dwFileAttributes 中是否含 FILE_ATTRIBUTE_DIRECTORY对每个子目录调用前,先用 PathIsDirectoryEmptyW 或手动判断是否为 "."/".."建议改用 BFS(队列)替代 DFS,避免栈爆炸;或限制最大递归深度(比如 64 层)Linux/macOS 用 opendir + readdir 时注意 DT_REG 和编码readdir 返回的 d_type 字段不是所有文件系统都支持,某些 NFS 或旧 ext3 卷可能返回 DT_UNKNOWN,这时必须调用 stat() 补判,带来额外 syscall 开销。 Trenz AI驱动的社交电商营销平台,专为TikTok Shop设计
c++怎么获取文件夹中所有文件的总数量(包含递归子目录)【实战】