温馨提示×

centos readdir怎么读取

小樊
49
2026-09-12 01:42:16
栏目: 智能运维

在 CentOS(Linux) 里,readdir 是 C 语言 POSIX 接口,用来读取目录内容。下面从用法、示例、常见问题三个方面说明。


一、readdir 基本用法

readdir 定义在 <dirent.h> 中,配合 opendir / closedir 使用。

函数原型

#include <dirent.h>

DIR *opendir(const char *name);
struct dirent *readdir(DIR *dirp);
int closedir(DIR *dirp);

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

二、CentOS 上 C 语言示例

示例:列出目录内容

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

int main(int argc, char *argv[]) {
    DIR *dir;
    struct dirent *entry;

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

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

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

    closedir(dir);
    return 0;
}

编译运行

gcc readdir_test.c -o readdir_test
./readdir_test /etc

三、常见注意事项(CentOS 特有)

1. . 和 ..

readdir 会返回:

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

通常要过滤:

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

2. 文件类型判断(推荐)

if (entry->d_type == DT_DIR)
    printf("[DIR] %s\n", entry->d_name);
else if (entry->d_type == DT_REG)
    printf("[FILE] %s\n", entry->d_name);

⚠️ 某些文件系统(如部分 NFS)d_type 可能为 DT_UNKNOWN


3. 线程安全(重要)

  • readdir 不是线程安全
  • 多线程环境请用:
readdir_r(dir, entry, &result);

4. 递归读取目录

readdir 只读取一层,递归需自己写:

if (entry->d_type == DT_DIR) {
    // 拼接路径
    // 再次 opendir + readdir
}

四、CentOS 相关补充

  • CentOS 7/8 都支持标准 POSIX readdir
  • 头文件:#include <dirent.h>
  • 编译无需额外库

如果你是想:

  • ✅ Shell 里读取目录
  • ✅ Python / C++ 读取目录
  • ✅ readdir 报错排查
  • ✅ 递归遍历目录示例

可以告诉我你的具体场景。

0 踩