温馨提示×

ubuntu readdir怎么配合opendir

小樊
43
2026-10-18 07:59:05
栏目: 智能运维

在 Ubuntu(Linux)下,使用 C/C++ 读取目录通常配合 opendir + readdir 一起使用,流程很固定。下面给你一个完整说明和示例。


一、基本用法流程

#include <dirent.h>
#include <stdio.h>

DIR *dir = opendir("目录路径");
if (dir == NULL) {
    perror("opendir");
    return -1;
}

struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
    printf("%s\n", entry->d_name);
}

closedir(dir);

二、函数说明

1. opendir

DIR *opendir(const char *name);
  • 打开一个目录
  • 成功返回 DIR* 指针
  • 失败返回 NULL

2. readdir

struct dirent *readdir(DIR *dirp);
  • 每次调用读取一个目录项
  • 返回 struct dirent *
  • 读到末尾返回 NULL

3. closedir

int closedir(DIR *dirp);
  • 关闭目录流

三、完整示例(Ubuntu C 程序)

#include <stdio.h>
#include <dirent.h>

int main(int argc, char *argv[]) {
    if (argc < 2) {
        printf("Usage: %s <directory>\n", argv[0]);
        return 1;
    }

    DIR *dir = opendir(argv[1]);
    if (dir == NULL) {
        perror("opendir");
        return 1;
    }

    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL) {
        printf("%s\n", entry->d_name);
    }

    closedir(dir);
    return 0;
}

编译运行:

gcc readdir_example.c -o readdir_example
./readdir_example /home

四、struct dirent 常用字段

struct dirent {
    ino_t          d_ino;     // inode 号
    off_t          d_off;
    unsigned short d_reclen;
    unsigned char  d_type;    // 文件类型
    char           d_name[256];
};

判断文件类型(可选)

if (entry->d_type == DT_REG)  // 普通文件
if (entry->d_type == DT_DIR)  // 目录

五、常见注意点

✅ 会读到:

  • .(当前目录)
  • ..(上级目录)

如需过滤:

if (strcmp(entry->d_name, ".") == 0 ||
    strcmp(entry->d_name, "..") == 0)
    continue;

✅ 不是递归的(只列当前目录)


六、如果你需要递归目录

可以用:

  • readdir + 递归调用
  • 或 nftw()(更专业)

如果你愿意,我可以给你:

  • 递归遍历目录示例
  • C++ 版本(std::filesystem)
  • 只列出某种类型文件的例子

直接说你的使用场景即可。

0 踩