温馨提示×

debian readdir能遍历吗

小樊
35
2026-09-22 14:48:44
栏目: 智能运维

在 Debian(以及所有 Linux 系统)上,readdir 是可以用来遍历目录的,但它是一次只读一个目录项的,不是“一次性遍历整个目录”。


一、readdir 是什么

readdir 是 POSIX 标准 C 库函数(在 <dirent.h> 中),用于读取已打开目录中的目录项。

#include <dirent.h>

struct dirent *readdir(DIR *dirp);
  • 每次调用返回一个 struct dirent *
  • 返回 NULL 表示:
    • 遍历结束
    • 或发生错误(需配合 errno)

二、典型遍历目录示例(C)

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

int main() {
    DIR *dir = opendir("/etc");
    if (!dir) {
        perror("opendir");
        return 1;
    }

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

    closedir(dir);
    return 0;
}

✅ 在 Debian 上完全可用
✅ 包括子目录名、文件名、符号链接等


三、常见注意点

1. . 和 .. 也会返回

.
..

一般需要过滤:

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

2. readdir 不是递归的

只遍历当前目录一层
要递归子目录,需要自己写递归逻辑。


3. 线程安全问题

  • readdir:非线程安全
  • 线程安全版本:
    readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
    
    ⚠️ 在新 glibc 中已不推荐使用,建议用 readdir + 单线程或加锁

四、Debian 上相关替代方案

方法 特点
readdir 最基础、最通用
scandir 一次读取并排序
fts_* 递归遍历更方便
nftw 遍历整个目录树
find / ls shell 级别

五、结论

✅ Debian 支持 readdir 遍历目录
✅ 适合 C / C++ 程序
❌ 不适合一次性拿全部文件(需循环)

如果你是想:

  • 写 C 程序
  • 在 shell 里遍历
  • 用 Python / Go
  • 做递归遍历

可以告诉我,我给你对应示例。

0 踩