之后已解决
在回校测试时之前发生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