温馨提示×

Debian怎么用readdir

小樊
48
2026-08-12 06:41:05
栏目: 智能运维

在 Debian(其实任何 Linux,只要是 C/C++)里,readdir 是用来读取目录内容的函数,属于 POSIX 标准,定义在 <dirent.h> 里。下面按常见用法给你一个完整说明。


1. readdir 是什么

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

#include <dirent.h>

相关函数

函数 作用
opendir() 打开目录
readdir() 读取目录项
closedir() 关闭目录

2. 基本使用示例(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

3. readdir 返回的结构体

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 判断

if (entry->d_type == DT_REG)  // 普通文件
if (entry->d_type == DT_DIR)  // 目录

⚠️ d_type 在某些文件系统(如 XFS)上可能不可用。


4. 忽略 ...

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

    printf("%s\n", entry->d_name);
}

5. C++ 中可以用吗?

可以,但它是 C 接口。

C++ 示例

#include <iostream>
#include <dirent.h>

int main() {
    DIR *dir = opendir(".");
    if (!dir) return 1;

    dirent *entry;
    while ((entry = readdir(dir)) != nullptr) {
        std::cout << entry->d_name << std::endl;
    }

    closedir(dir);
}

6. 推荐:现代 C++(C++17)

如果你用的是 C++17 或以上,更推荐用 <filesystem>

#include <filesystem>
#include <iostream>

int main() {
    for (auto &p : std::filesystem::directory_iterator(".")) {
        std::cout << p.path() << std::endl;
    }
}

编译:

g++ -std=c++17 fs_example.cpp -o fs_example

7. 常见错误

❌ 忘记 closedir

opendir(...) 后必须 closedir(...)

❌ 直接用 readdir 判断文件类型(不靠谱)

stat() 更可靠:

#include <sys/stat.h>

总结

✅ Debian 下 readdir 用法和标准 Linux 一样
✅ 适合 C / C++
✅ 新项目建议用 std::filesystem


如果你需要:

  • 递归遍历目录
  • 判断文件/目录
  • readdirls 命令
  • 在嵌入式或老系统用

可以告诉我你的具体需求,我可以给你对应代码。

0