温馨提示×

readdir在Linux怎么用

小樊
41
2026-08-18 02:28:26
栏目: 智能运维

readdir 是 Linux 中用于读取目录内容的函数,常见于 C 语言编程。它不是 shell 命令,而是 POSIX 标准库函数,定义在 <dirent.h> 中。

下面分几种常见用法说明。


一、readdir 是干什么的?

readdir 用来遍历一个目录里的文件和子目录,类似于 ls 命令的内部实现方式。


二、基本使用流程(C 语言)

1️⃣ 需要的头文件

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

2️⃣ 基本示例(最常用)

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

int main() {
    DIR *dir;
    struct dirent *entry;

    dir = opendir(".");  // 打开当前目录
    if (dir == NULL) {
        perror("opendir");
        return 1;
    }

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

    closedir(dir);
    return 0;
}

输出示例

.
..
main.c
test.txt

三、关键函数说明

1️⃣ opendir

DIR *opendir(const char *name);

打开目录,返回目录流指针。


2️⃣ readdir

struct dirent *readdir(DIR *dirp);
  • 每次调用返回一个目录项
  • 返回 NULL 表示结束或出错

3️⃣ 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]; // 文件名
};

示例:

entry->d_name

4️⃣ closedir

int closedir(DIR *dirp);

四、过滤 ...(常见需求)

if (strcmp(entry->d_name, ".") != 0 &&
    strcmp(entry->d_name, "..") != 0) {
    printf("%s\n", entry->d_name);
}

五、判断文件类型(可选)

⚠️ d_type 不是 100% 可移植,推荐用 stat

方法一:用 d_type(快速)

if (entry->d_type == DT_REG) {
    printf("普通文件: %s\n", entry->d_name);
} else if (entry->d_type == DT_DIR) {
    printf("目录: %s\n", entry->d_name);
}

方法二:用 stat(最可靠)

#include <sys/stat.h>

struct stat st;
stat(entry->d_name, &st);

if (S_ISREG(st.st_mode)) {
    printf("普通文件\n");
} else if (S_ISDIR(st.st_mode)) {
    printf("目录\n");
}

六、readdir 不是 shell 命令

❌ 错误用法:

readdir /home

✅ 正确方式:

  • 写 C 程序
  • 或直接在 shell 用:
ls

find

七、常见错误

问题 说明
返回 NULL 目录已读完或出错
不显示文件 忘记 opendir
段错误 没检查 opendir 返回值
中文乱码 与本地编码有关,不是 readdir 的问题

八、总结一句话

readdir 是 C 语言中用来逐个读取目录项的函数,配合 opendir / closedir 使用。

如果你愿意,我可以:

  • ✅ 写一个 递归遍历目录的例子
  • ✅ 写一个 类似 ls -l 的实现
  • ✅ 对比 readdir vs readdir_r vs getdents

你现在是 写代码用 还是 理解原理

0