温馨提示×

ubuntu copendir如何编写

小樊
40
2026-07-07 16:46:23
栏目: 智能运维

Ubuntu(Linux) 下,opendir() 是用来打开目录的函数,属于 POSIX 标准库,常用于遍历目录内容。下面给你一个从基础到完整示例的说明。


一、opendir 基本说明

头文件

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

函数原型

DIR *opendir(const char *name);

返回值

  • 成功:返回 DIR* 目录流指针
  • 失败:返回 NULL,并设置 errno

二、基本使用示例(最常用)

示例:打开当前目录并列出文件

#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 opendir_example.c -o opendir_example
./opendir_example

三、遍历指定目录

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

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

    if (argc < 2) {
        printf("用法: %s <目录路径>\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;
}

运行:

./a.out /home

四、过滤 ...

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

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

五、判断文件类型(目录 / 普通文件)

⚠️ dirent->d_type 不是所有文件系统都支持(ext4 支持,NFS 可能不支持)

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

更可靠的方法(推荐):

#include <sys/stat.h>

struct stat st;
stat(entry->d_name, &st);

if (S_ISREG(st.st_mode))
    printf("普通文件\n");
else if (S_ISDIR(st.st_mode))
    printf("目录\n");

六、常见错误

1️⃣ 忘记 closedir

closedir(dir);

2️⃣ 目录不存在

opendir: No such file or directory

3️⃣ 权限不足

opendir: Permission denied

七、总结流程

opendir()
   ↓
readdir()
   ↓
处理目录项
   ↓
closedir()

如果你需要:

  • 递归遍历目录
  • 用 C++ 实现
  • 实现 ls 命令类似功能
  • 结合 stat / inotify

可以直接告诉我,我可以帮你一步步写。

0