温馨提示×

怎么用copendir遍历Ubuntu目录

小樊
42
2026-08-02 20:18:17
栏目: 智能运维

在 Ubuntu(Linux) 下,opendir() 是用来打开目录流,配合 readdir() 遍历目录内容的,属于 POSIX 标准 API,常用于 C/C++ 程序。

下面给你一个 完整、可用的示例,从概念到代码一步步说明。


一、基本流程

使用 opendir 遍历目录的一般步骤:

  1. 调用 opendir(path) 打开目录
  2. 循环调用 readdir(dir) 读取目录项
  3. 处理每一个目录项(文件名、类型等)
  4. 调用 closedir(dir) 关闭目录

二、示例代码(C 语言)

示例:遍历 /home 目录

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

int main() {
    DIR *dir;
    struct dirent *entry;

    dir = opendir("/home");
    if (dir == NULL) {
        perror("opendir");
        return EXIT_FAILURE;
    }

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

    closedir(dir);
    return EXIT_SUCCESS;
}

三、编译与运行(Ubuntu)

gcc listdir.c -o listdir
./listdir

四、常见 dirent 结构体字段

struct dirent {
    ino_t          d_ino;       // inode 号
    off_t          d_off;
    unsigned short d_reclen;
    unsigned char  d_type;      // 文件类型
    char           d_name[256]; // 文件名
};

判断文件类型(可选)

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)上可能不可用,此时需要用 lstat()。


五、递归遍历目录(常见需求)

#include <stdio.h>
#include <stdlib.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() {
    list_dir("/home");
    return 0;
}

六、常见错误

1️⃣ opendir 返回 NULL

  • 权限不足
  • 路径不存在
ls -ld 目录名

2️⃣ 忘记 closedir

会导致 文件描述符泄露


七、相关函数对比

函数 用途
opendir() 打开目录
readdir() 读取目录项
closedir() 关闭目录
scandir() 高级目录遍历(可排序、过滤)
fts_open() 递归遍历(更专业)

八、如果你用的是 C++

可以用:

  • std::filesystem::directory_iterator(C++17,推荐)
  • 或仍然用 opendir

如果你愿意,我可以给你 C++ 示例 或 只遍历特定类型文件(如 .txt) 的版本。

0 踩