温馨提示×

ubuntu readdir怎么使用

小樊
49
2026-09-12 13:02:40
栏目: 智能运维

在 Ubuntu(Linux)下,readdir 通常是 C 语言中使用目录操作的函数,来自 <dirent.h>。下面从「是什么、怎么用、完整示例、常见问题」给你讲清楚。


一、readdir 是什么

readdir 用于逐个读取目录中的文件和子目录

函数原型:

#include <dirent.h>

struct dirent *readdir(DIR *dirp);
  • 参数:DIR* 目录流(由 opendir 打开)
  • 返回值:
    • 成功:指向 struct dirent 的指针
    • 失败 / 读到末尾:返回 NULL

二、基本使用流程

opendir()   // 打开目录
  ↓
readdir()   // 循环读取
  ↓
closedir()  // 关闭目录

三、完整示例(C 语言)

示例:列出当前目录所有文件

#include <stdio.h>
#include <dirent.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;
}

编译运行

gcc readdir_example.c -o readdir_example
./readdir_example

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

判断文件类型(d_type)

DT_REG  // 普通文件
DT_DIR  // 目录
DT_LNK  // 符号链接

示例:

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

五、忽略 ...

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

六、递归遍历目录(常见需求)

如果你需要递归列出子目录,可以配合 statd_type 自己写递归函数(或者用 nftw)。


七、常见问题

1. readdir 是线程安全的吗?

  • readdir ❌ 不是线程安全
  • 多线程请用 readdir_r(已不推荐)或 readdir + 加锁

2. readdir 返回的名字是 UTF-8 吗?

  • Linux 下通常是 UTF-8(取决于系统 locale)

3. 想用 C++?

  • 可用 <filesystem>(C++17)

八、如果只是命令行用

不用写代码:

ls
ls -a
find .

如果你愿意,我可以:

  • 给你 递归目录示例
  • 给你 C++ filesystem 版本
  • 解释 readdir vs scandir 区别

你现在是 写 C 程序 还是 只是想理解怎么用

0