linux系统下ls -r命令的简单实现(C语言版)

ls -r

这篇博客继续深入探索ls命令。下面的程序代码继续沿用了上两篇文章所用的错误处理方式,但又对之前的错误处理进行了升级,加入了错误处理函数error_print 。并且通过atexit函数加入了动态分配内存的收集与处理。
由于我的编译环境在终端,每一行只能显示80个字符,所以有些语句太长我该成了两行。

// lsr.h
#ifndef LSR
#define LSR

#include <stdio.h>   // printf()
#include <unistd.h>  // getcwd()
#include <string.h>  // strlen() strcpy() strcat() memset()
#include <stdlib.h>  // exit() malloc() free() atexit()
#include <dirent.h>  // opendir() closedir() readdir()

typedef struct FileInfoList {
                 // 使用链表存储
        char *name;                        // 存储文件/文件夹名
        struct FileInfoList *dir;          // 当name存储文件名时为空 
        								   // 当name存储文件夹名时指向文件夹中的文件
        struct FileInfoList *file;    	   // 指向下一个(next)
} file_info_list;                  

file_info_list head;                       // 全局变量 头节点

// 这个结构体作为链表节点存储动态内存分配后需要释放的动态内存空间
typedef struct NeedFreeList {
   
        char *ptr;                       // 需要free的指针
        struct NeedFreeList *next;       // 下一个
} need_free_list;

need_free_list *begin = NULL;            // 全局变量 开头指针

typedef enum ERROR {
                        // 各种错误信息
        ERROR_CODE_OK,
        ERROR_CODE_MALLOC_GETPATH,
        ERROR_CODE_MALLOC_COLLECT,
        ERROR_CODE_GETCWD,
        ERROR_CODE_OPENDIR,
        ERROR_CODE_COLLECT,
        ERROR_CODE_MALLOC_NODE,
        ERROR_CODE_MALLOC_NAME,
        ERROR_CODE_MALLOC_DIRPATH
} error;

error malloc_collect(char *);                 // 动态内存分配后收集需要free的动态内存指针
void clear(void);                             // 终止处理程序
void error_print(error);                      // 错误信息输出
error getpath(char**);                        // 得到路径
error filename_collect(char*, file_info_list*);     // 文件名收集函数 (递归)
void sort(file_info_list*, file_info_list*);        // 将节点插入链表中并保持有序
void print(file_info_list*, int);                   // 输出以head为头节点存储的文件/文件夹名

#endif

下面时 .c 文件,包含具体的函数实现

// lsr.c
#include "lsr.h"

//#define TEST

int main(void)
{
   
        atexit(clear);                    // 登记clear这个终止处理程序
        char *path;
        error errcode = getpath(&path);     // 得到当前路径 实参是指针path的地址 不是path
        if (errcode 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值