在C++中获取文件夹文件列表:从新手到专家的完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么你需要在C++中获取文件列表?



想象一下:你正在编写一个程序,需要处理数百个日志文件、检查配置文件是否存在,或者仅仅是想向用户展示文件夹中的内容。如果没有“查看”目录内部的能力,你就会遇到障碍。正因如此,“How can I get the list of files in a directory using C or C++?” 这个问题是Stack Overflow上最热门的问题之一。今天,我们将从头到尾彻底剖析它。



在本文中,我将展示三种主要方法:从经典的C风格(通用性强,但需要小心谨慎)到现代的C++17 std::filesystem(简洁、安全且优雅)。你将了解如何根据任务选择正确的工具,并获得可以直接插入到项目中的现成代码示例。



方法1:经典方法——dirent.h (POSIX / Linux / macOS)



这种方法是所有解决方案的“鼻祖”。它用于Unix类系统上的C和C++。原理很简单:打开目录,逐条读取记录,然后关闭。没有花哨的功能,但完全可控。



头文件和结构体

你需要以下内容:

  • #include <dirent.h> — 用于目录操作
  • DIR *dir — 指向目录流的指针
  • struct dirent *entry — 包含文件名的结构体


代码示例:简单输出所有文件名

#include <iostream>#include <dirent.h>

int main() { const char* path = "."; // 当前文件夹 DIR* dir = opendir(path); if (dir == nullptr) { std::cerr << "无法打开目录: " << path << std::endl; return 1; }

struct dirent* entry; while ((entry = readdir(dir)) != nullptr) { std::cout << entry->d_name << std::endl; }

closedir(dir); return 0;}


重要注意事项

  • readdir() 函数会返回 .(当前目录)和 ..(父目录)。通常需要跳过它们:
if (entry->d_name[0] == '.') continue;
  • 这段代码**无法直接在Windows上运行**。对于Windows,有 windows.h 和 FindFirstFile/FindNextFile(稍后会介绍)。
  • 优点:简洁,无需C++17即可工作。缺点:不可跨平台,无法按文件类型过滤。


方法2:Windows API——FindFirstFile 和 FindNextFile



如果你的目标是Windows,请忘记 dirent.h。改用原生的WinAPI。它功能强大,但代码会比较冗长。



工作原理

  1. 调用 FindFirstFile 并传入模式(例如 "C:\\\\*")。
  2. 获取句柄和第一个条目。
  3. 在循环中调用 FindNextFile,直到返回0。
  4. 通过 FindClose 关闭句柄。


示例:列出C盘根目录下的文件

#include <iostream>#include <windows.h>

int main() { WIN32_FIND_DATA findFileData; HANDLE hFind = FindFirstFile("C:\\\\*", &findFileData);

if (hFind == INVALID_HANDLE_VALUE) { std::cerr << "无法找到文件 (错误代码: " << GetLastError() << ")" << std::endl; return 1; }

do { // 跳过 "." 和 ".." if (strcmp(findFileData.cFileName, ".") != 0 && strcmp(findFileData.cFileName, "..") != 0) { std::cout << findFileData.cFileName << std::endl; } } while (FindNextFile(hFind, &findFileData) != 0);

FindClose(hFind); return 0;}


需要了解的内容

  • 在 WIN32_FIND_DATA 中有一个 dwFileAttributes 字段

博客

书籍推荐