my_ls实现(-a,-l,-R)

之后已解决

在回校测试时之前发生ls / -R无法打开根目录的方法是把-R循环下的count计数给去掉
原来的count计数是为了获取该目录下的文件来防止文件数过多无法打印

在这里插入图片描述

由于根目录下有些目录下面文件很多所以不能加count
如果出现/run/user/1000下面打开报错
请去加管理员权限再执行
或者重新执行
这里是解决的链接

踩坑&吐槽

  • 嗯,博主在月前(三月)就基本照着书打了一遍,看的很懵懂,后来看网课扩展了一下,大约月中的时候过来又写了一个版本,实现了颜色,结果去根目录一查/发现一直是在当前目录循环,嗯,不是它错了是我菜
  • 月底由于总结了一下基础,再回来看这个demo,我去,没有用,学长还帮我指了一下是目录和文件if else判断的时候分支走的不对,打个比方,我给它指定上层目录进行-a的命令的模拟,它不给我返回上一层进行操作,当时我就懵逼了
    在这里插入图片描述
  • 好了,我已经学了一个月了,现在去找bug,这一找又是一个星期,四月是居的日子,重新写了一个demo,递归都快完善好了,去往指定目录下的操作压根没有用,开始怀疑人生...生活终于对本人下手了..
  • 然后复制了别人的主函数来一层层看,在别人的主函数下面我就能跑,自己就跑不了,我真的吐了..所以下面有一个巨坑我踩了半个月,希望看过这个博客的人不要再粗心了
    在这里插入图片描述
  • 在命令行参数解析那一层逻辑下,对保存"-"的个数的计数器num方法应该在有参数里面,即有参数就保存个数,如果你写外面,抱歉,永远到不了指定目录
  • 目前写了两个版本,一个有展示-R的函数,不过要在原来的展示目录函数下进行参数判定,如果取主函数判定了,会在展示目录函数那层出现无法错,原因是无法打开(opendir)目录,emmmm,这个错误到底啥原理还真没明白

一些要点

  • 一些琐碎的操作看过<linuxc编程实战>的人应该会懂里面的大概逻辑关系,我写的相对比较简单,就是对递归的一些操作
  • 递归时要注意不能反复递归...,因为在当前目录下.目录和..就是当前目录,不进行筛选的话,程序马上就爆了(一开始我们只分配了256大小空间的字符数组)
  • 如果你是单独在外面写了一个递归函数的话,记得去display_dir函数下进行逻辑判定

代码

#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<errno.h>
#include<dirent.h>
#include<pwd.h>
#include<errno.h>
#include<grp.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

#define PARAM_NONE 0 //无参数
#define PARAM_A    1    //-a:显示所有文件
#define PARAM_L    2  //-l:一行只显示一个文件的详细信息
#define PARAM_R    4  //-R:使用递归连同目录中的子目录中的文件显示出来,如果要显示隐藏文件就要添加-a参数
#define MAXLEN  80 //一行显示的最多字符数
//#define 
int g_leave_len=MAXLEN; //一行剩余长度,用于输出对齐
int g_maxlen;      //存放某目录下最长文件名的长度
int colour;        //颜色


void my_err(const char* err_string,int line);
void display_attribute(struct stat buf,char* name);
void display(int flag,char* pathname);
void display_dir(int flag_param,char* path);
void display_R(int flag_param,char* path);
void display_colour(char name[]);



/*
30: 黑
31: 红
32: 绿
33: 黄
34: 蓝
35: 紫
36: 深绿
37: 白色
*/
void display_colour(char name[])
{
   
    struct stat buf;
    lstat(name,&buf);
    if(S_ISREG(buf.st_mode))//  一般文件
    {
   
        colour=37;//      白色
        if((buf.st_mode&S_IXOTH)||(buf.st_mode&S_IXGRP)||(buf.st_mode&S_IXUSR))//    文件所有者,用户组,其他用户可执行权限
            colour=32;//        绿色
    }
    else if(S_ISDIR(buf.st_mode))//   目录文件
        colour = 34;//          蓝色
    else if(S_ISCHR(buf.st_mode))//   字符设备文件
        colour = 33;//          黄色
    else if(S_ISBLK(buf.st_mode))//   块设备文件
        colour = 33;//     黄色
    else if(S_ISFIFO(buf.st_mode))// FIFO
        colour = 35;//          紫红色
    else if(S_ISLNK(buf.st_mode))//   符号链接
        colour = 36;//      青蓝色
    else if(S_ISSOCK(buf.st_mode))//  SOCKET
        colour = 36;//          青蓝色
}


void my_err(const char* err_string,int line)
{
   
    fprintf(stderr,"line:%d",line);
    perror(err_string);
    exit(1);
}

//获取文件属性并打印
void display_attribute(struct stat buf,char* name)
{
   
    char buf_time[32];
    struct passwd *psd;//从该结构体中获取文件所有者的用户名
    struct group *grp;//从该结构体中获取文件所有者所属组的组名

    //display_colour(name);
    //获取并打印文件类型
    if(S_ISLNK(buf.st_mode))//符号链接
        printf("l");
    else if(S_ISREG(buf.st_mode))//一般文件
        printf("-");
    else if(S_ISDIR(buf.st_mode))//目录文件
        printf("d");
    else if(S_ISCHR(buf.st_mode))//字符设备文件
        printf("c");
    else if(S_ISBLK(buf.st_mode))//块设备文件
        printf("b");
    else if(S_ISFIFO(buf.st_mode))//先进先出FIFO
        printf("f");
    else if
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值