c++怎么获取文件夹中所有文件的总数量(包含递归子目录)【实战】

张开发
2026/4/16 4:47:31 15 分钟阅读

分享文章

c++怎么获取文件夹中所有文件的总数量(包含递归子目录)【实战】
C17起推荐用std::filesystem::recursive_directory_iterator递归遍历它自动跳过符号链接循环、无需手写递归但需try-catch捕获filesystem_error用is_regular_file()过滤文件并注意编译链接要求。用 std::filesystem::recursive_directory_iterator 遍历最直接C17 起std::filesystem 是标准方案不用依赖 Boost 或系统 API。它天然支持递归遍历且自动跳过循环符号链接默认行为比手写递归或调用 FindFirstFile / opendir 更可靠。常见错误是误用 directory_iterator非 recursive 版——它只扫一层漏掉子目录里的文件或者没处理异常遇到权限不足的目录如 /proc 下某些条目直接崩溃。必须加 #include filesystem/filesystem并链接 -lstdcfsGCC 早期版本或启用 C17 标准-stdc17遍历时用 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 需手动递归容易栈溢出如果项目不能用 C17又必须纯 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设计

更多文章