【C语言】遍历目录树

191 篇文章 0 订阅 ¥19.90 ¥99.00
188 篇文章 0 订阅 ¥19.90 ¥99.00

在 Linux 环境下,如果编写程序且需要通过函数接口来遍历目录树,可以考虑使用以下几个常用的调用:

1. opendir() / readdir() / closedir():

   这是 POSIX 标准定义的函数,用于遍历目录。`opendir()` 用于打开一个目录,`readdir()` 用于读取目录内的项,`closedir()` 用于关闭目录。遍历目录时,通常会对获取的每一个条目进行判断,以确定它是文件还是目录。对于目录项需要递归地调用遍历函数。

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

   void listdir(const char *name, int indent)
   {
       DIR *dir;
       struct dirent *entry;

       if (!(dir = opendir(name)))
           return;

       while ((entry = readdir(dir)) != NULL) {
           if (entry->d_type == DT_DIR) {
               char path[1024];
               if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
                   continue;
               snpr
  • 38
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
实现 C 语言二级目录形结构可以采用链表的方式,每个节点包含一个文件或目录的名称、类型(文件或目录)、父目录、子目录和兄弟目录指针。 具体实现步骤如下: 1.定义目录项结构体 ``` struct dir_item { char name[256]; // 文件或目录名称 int type; // 文件类型(0表示目录,1表示文件) struct dir_item *parent; // 父目录指针 struct dir_item *child; // 子目录指针 struct dir_item *sibling;// 兄弟目录指针 }; ``` 2.创建根目录 ``` struct dir_item root; strcpy(root.name, "root"); root.type = 0; // 目录类型 root.parent = NULL; root.child = NULL; root.sibling = NULL; ``` 3.添加子目录或文件 ``` void add_item(struct dir_item *parent, struct dir_item *item) { if (parent == NULL || item == NULL) { return; } item->parent = parent; if (parent->child == NULL) { parent->child = item; } else { struct dir_item *p = parent->child; while (p->sibling != NULL) { p = p->sibling; } p->sibling = item; } } ``` 4.遍历目录 ``` void traverse(struct dir_item *dir, int level) { if (dir == NULL) { return; } int i; for (i = 0; i < level; i++) { printf(" "); // 每一级目录缩进两个空格 } printf("%s\n", dir->name); if (dir->type == 0) { // 如果是目录,则递归遍历目录 struct dir_item *p = dir->child; while (p != NULL) { traverse(p, level+1); p = p->sibling; } } } ``` 使用示例: ``` int main() { struct dir_item dir1, dir2, dir3, file1, file2; strcpy(dir1.name, "dir1"); dir1.type = 0; // 目录类型 add_item(&root, &dir1); strcpy(file1.name, "file1"); file1.type = 1; // 文件类型 add_item(&dir1, &file1); strcpy(dir2.name, "dir2"); dir2.type = 0; // 目录类型 add_item(&dir1, &dir2); strcpy(file2.name, "file2"); file2.type = 1; // 文件类型 add_item(&dir2, &file2); strcpy(dir3.name, "dir3"); dir3.type = 0; // 目录类型 add_item(&root, &dir3); traverse(&root, 0); return 0; } ``` 输出结果: ``` root dir1 file1 dir2 file2 dir3 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

109702008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值