温馨提示×

centos readdir怎样遍历目录

小樊
40
2026-10-09 01:23:02
栏目: 智能运维

在 CentOS(本质上是 Linux)下,使用 C 语言的 readdir 遍历目录,一般配合 opendir、readdir、closedir 使用。下面给你一个完整示例 + 说明。


一、基本思路

  1. opendir() 打开目录
  2. readdir() 逐个读取目录项
  3. 判断是否是普通文件 / 子目录
  4. closedir() 关闭目录

二、示例代码(遍历单层目录)

#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
    DIR *dir;
    struct dirent *entry;

    if (argc < 2) {
        printf("Usage: %s <directory>\n", argv[0]);
        return 1;
    }

    dir = opendir(argv[1]);
    if (dir == NULL) {
        perror("opendir");
        return 1;
    }

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

    closedir(dir);
    return 0;
}

编译运行

gcc readdir_test.c -o readdir_test
./readdir_test /etc

三、区分文件 / 目录(推荐)

readdir 返回的 d_type 可以判断类型(CentOS 支持):

while ((entry = readdir(dir)) != NULL) {
    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);
}

常见类型:

  • DT_REG:普通文件
  • DT_DIR:目录
  • DT_LNK:符号链接

四、递归遍历目录(常用)

#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>

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

    if (!dir) return;

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

        snprintf(fullpath, sizeof(fullpath), "%s/%s", path, entry->d_name);
        printf("%s\n", fullpath);

        if (entry->d_type == DT_DIR)
            list_dir(fullpath);
    }
    closedir(dir);
}

int main(int argc, char *argv[])
{
    if (argc < 2) return 1;
    list_dir(argv[1]);
    return 0;
}

五、常见问题

1. CentOS 版本影响?

  • CentOS 6/7/8 都支持 readdir
  • readdir_r 已废弃,推荐用 readdir

2. 需要头文件

#include <dirent.h>
#include <sys/types.h>

如果你需要:

  • 只遍历某类型文件(如 .log)
  • 用 C++ / shell / Python
  • 统计文件数量 / 大小

可以直接告诉我。

0 踩