温馨提示×

ubuntu readdir怎么用

小樊
34
2026-10-09 13:25:23
栏目: 智能运维

在 Ubuntu(Linux)下,readdir 通常是指 C 语言标准库中的 readdir() 函数,用来读取目录中的文件。下面给你一个从基础到可用的完整说明。


一、readdir 是什么

readdir 用于 逐个读取目录中的条目(文件/子目录)。

相关头文件:

#include <dirent.h>

函数原型:

struct dirent *readdir(DIR *dirp);
  • dirp:由 opendir() 打开的目录指针
  • 返回值:
    • 成功:指向 struct dirent 的指针
    • 读取结束:返回 NULL
    • 出错:返回 NULL(用 errno 判断)

二、基本使用步骤

1️⃣ 打开目录

DIR *dir = opendir(".");

2️⃣ 读取目录

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

3️⃣ 关闭目录

closedir(dir);

三、完整示例

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

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

int main() {
    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);
    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[];  // 文件名
};

判断文件类型(d_type)

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

五、常见注意点

⚠️ 1. . 和 ..

readdir 会返回:

.
..

通常需要跳过:

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

⚠️ 2. readdir 不是线程安全的

  • 线程安全版本:readdir_r()(已不推荐)
  • 新代码推荐用 readdir() + 单线程或加锁

⚠️ 3. 只能读文件名

不能获取:

  • 文件大小
  • 权限
  • 修改时间

需要配合:

stat() / lstat()

六、进阶:结合 stat 获取文件信息

#include <sys/stat.h>

struct stat st;
stat(entry->d_name, &st);
printf("size: %ld\n", st.st_size);

七、如果你指的是“命令”

Linux 没有 readdir 命令,但你可能想用:

ls
ls -l
find .

如果你愿意,可以告诉我:

  • 你用的是 C / C++ / Python / Shell?
  • 是想 遍历目录 / 过滤文件 / 递归子目录?

我可以给你更针对性的示例。

0 踩