温馨提示×

ubuntu readdir能遍历吗

小樊
40
2026-10-06 14:19:43
栏目: 智能运维

在 Ubuntu(Linux) 上,readdir 是可以用来遍历目录的,而且这是最标准、最常用的方法之一。


一、readdir 是什么?

readdir 是 POSIX 标准 API,定义在:

#include <dirent.h>

函数原型:

struct dirent *readdir(DIR *dirp);

它用于 逐个读取目录中的条目(文件、子目录、符号链接等)。


二、基本遍历示例(C 语言)

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

int main(int argc, char *argv[]) {
    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;
}

✅ 在 Ubuntu 上完全可以编译运行:

gcc readdir_test.c -o readdir_test
./readdir_test

三、readdir 能遍历哪些内容?

✅ 普通文件
✅ 子目录
✅ 隐藏文件(如 .bashrc)
✅ 符号链接
❌ 不会自动递归子目录(需要自己写递归)


四、递归遍历目录(示例思路)

void list_dir(const char *path) {
    DIR *dir = opendir(path);
    struct dirent *entry;

    while ((entry = readdir(dir)) != NULL) {
        if (entry->d_type == DT_DIR) {
            if (strcmp(entry->d_name, ".") == 0 ||
                strcmp(entry->d_name, "..") == 0)
                continue;

            char newpath[1024];
            sprintf(newpath, "%s/%s", path, entry->d_name);
            list_dir(newpath);
        } else {
            printf("%s/%s\n", path, entry->d_name);
        }
    }
    closedir(dir);
}

五、常见问题(Ubuntu 特有)

1️⃣ readdir vs readdir_r

  • readdir:线程不安全(但简单)
  • readdir_r:线程安全(已逐渐废弃)
  • 现代 Linux 推荐使用 readdir

2️⃣ 符号链接问题

readdir 只返回目录项,不解析真实路径

如需判断真实文件类型,用:

lstat() / stat()

3️⃣ 性能

  • 对大目录(几万文件)完全没问题
  • 比 system("ls") 高效得多

六、如果你用的是其他语言

  • C++:<filesystem>(C++17)
  • Python:os.listdir / os.scandir
  • Shell:find

如果你是想问:

  • readdir 能不能遍历所有文件(包括子目录)?
  • Ubuntu 下有什么限制?
  • 和 inotify / ftw / nftw 的区别?

可以告诉我你的使用场景,我可以进一步说明。

0 踩