温馨提示×

怎么用readdir获取文件名

小樊
38
2026-08-29 07:14:28
栏目: 编程语言

readdirC 语言里用来读取目录内容的函数,通常配合 opendir / closedir 使用。下面给你一个从零开始的完整示例,说明如何用 readdir 获取文件名。


一、基本用法(获取当前目录下所有文件名)

示例代码

#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;
}

输出示例

.
..
main.c
test.txt
a.out

二、readdir 返回了什么?

readdir() 返回的是一个结构体指针:

struct dirent {
    ino_t          d_ino;       // inode 编号
    off_t          d_off;
 // 目录偏移
    unsigned short d_reclen;   // 长度
    unsigned char  d_type;     // 文件类型
    char           d_name[256];// 文件名(重点)
};

我们一般用的是:

entry->d_name   // 文件名

三、过滤 ...

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

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

四、区分文件和目录(可选)

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

⚠️ 注意:d_type 在某些文件系统(如 NFS)上可能不可用。


五、读取指定目录

dir = opendir("/home/user/");

六、常见错误

❌ 忘记 opendir
❌ 忘记 closedir
❌ 把 readdir 当成返回字符串的函数

✅ 正确流程:

opendir → readdir 循环 → closedir

七、完整可运行示例(推荐)

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

int main(int argc, char *argv[]) {
    const char *path = argc > 1 ? argv[1] : ".";
    DIR *dir = opendir(path);

    if (!dir) {
        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
./readdir_example /tmp

如果你用的是 C++ / Python / Linux shell,或者想递归遍历目录,我也可以继续帮你写。

0