在C++中如何通过文件描述符列出目录中的文件?
在Ubuntu的C++中通过目录文件描述符获取文件列表
当然可以,但不能用普通的read()函数——Linux下目录并非普通文件,直接调用read()会触发错误。你需要借助POSIX标准的目录遍历API,结合已有的文件描述符来实现。
核心思路
- 用
fdopendir()将目录文件描述符转换为DIR*目录流指针(这是POSIX特有的函数,Ubuntu完全支持) - 通过
readdir()循环读取目录中的每一项 - 最后用
closedir()关闭目录流(同时会自动关闭对应的文件描述符)
完整代码示例
#include <iostream> #include <dirent.h> #include <unistd.h> #include <cstring> #include <cerrno> int main() { // 示例:先打开目录得到文件描述符(实际场景中你已经持有这个fd) int dir_fd = open("/home/your-user/test-dir", O_RDONLY | O_DIRECTORY); if (dir_fd == -1) { std::cerr << "打开目录失败: " << strerror(errno) << std::endl; return 1; } // 将文件描述符转为目录流指针 DIR* dir_stream = fdopendir(dir_fd); if (!dir_stream) { std::cerr << "fdopendir调用失败: " << strerror(errno) << std::endl; close(dir_fd); return 1; } struct dirent* entry; // 遍历所有目录项 while ((entry = readdir(dir_stream)) != nullptr) { // 跳过当前目录(.)和上级目录(..) if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) { continue; } // 输出文件名 std::cout << entry->d_name << std::endl; } // 检查readdir是否发生错误 if (errno != 0) { std::cerr << "读取目录项失败: " << strerror(errno) << std::endl; closedir(dir_stream); return 1; } // 关闭目录流,同时会自动关闭对应的文件描述符 closedir(dir_stream); return 0; }
注意事项
fdopendir()会接管传入的文件描述符,所以调用closedir()后无需再手动close(dir_fd),避免重复关闭导致错误。- 这个方法仅适用于类Unix系统(如Ubuntu、CentOS等),如果需要跨Windows平台,需要使用Windows API(如
FindFirstFileW系列函数)。 - 编译时无需额外链接库,直接用g++编译即可:
g++ dir_list.cpp -o dir_list
内容的提问来源于stack exchange,提问作者user14205680
相关产品推荐
相关产品推荐

