You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:37:20