[linux-c]week1:ls基础命令的实现

本周项目为:

编写myls程序,在命令行界面实现ls的基本功能。

基本需求:
  • 实现ls -a
  • 实现ls -l
  • 实现ls -R
  • 实现上述三种功能混合查找
  • 界面需要美观(对齐等格式要处理好)

此项目运用大量linux文件操作,我相关知识的学习也是基于《Linux C 编程实战》第六章内容。

功能分析:

分析ls函数拥有哪些功能。
首先,看一下ls:
ls [-alrtAFR] [name...] 被用以显示目录内容。
没错,这是我最近写代码的“草稿区”
不只是文件的完整地址,在ls -l的功能中,我们需要显示出每个文件的类型、权限、大小等等,因此要借助struct stat buf,通过完整的地址 pathname 来获取文件信息。鉴于lstat函数返回的是符号链接文件本身的信息,这里使用语句
lstat(pathname,&buf),同时可以通过其返回值是否为-1,判断文件属性是否获取成功。
在这里插入图片描述
此外,也会需要DIRstruct dirent类型的指针来获取文件属性信息,使用方法不在此赘述。

第二点,是ls 不带-l时产生的“输出对齐”问题。从第一张图中可以看到,我们需要把所有文件排序后,按行列对齐的格式输出。原程序使用的是竖列打印的方式,但是对于我来说过于复杂,难以用程序控制,所以在myls中,我选择的是横排顺序输出的方法,如下图。

在这里插入图片描述实际操作起来也比较简单:设定全局变量为一行的输出最长长度#define LMAX 100和当前输出行剩余长度int l_leave=LMAX,并在之前判断需打印的最长文件名长度int l_max。使每行打印LMAX / l_max个文件名,并用格式化输出使其对其即可。
第三点就是稍微复杂一点的-R功能了。其原理比较好解释,就是在调用分析函数时,运用递归的思想,当当前文件类型为目录时,进入它,并再次调用函数。
在这里插入图片描述

函数实现

我们需要在命令行形式下调用myls,所以和以前的简单函数不同,需要判断main函数的参数。
因为myls支持输入文件名或者不完全的相对地址,我们需要在最初分析参数path时,在前面加上‘ . / ’,后面补齐‘ / ’。

strcpy(path,"./");
if(S_ISDIR(buf.st_mode))//是目录
{
	if(path[nn-1]!='/')
		strcat(path,"/");
	strcat(path,"\0");
	...
}

需要注意的是,此类功能板块较多的函数,很容易因为一处疏忽而报错误。因此我按照书本的示例写了一个my_err函数,对不同位置不同问题的函数进行报错。我在源代码中也有很多注释,方便我在后续引用函数或代码块时能快速理解。

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

我的三大类标示注释:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
myls命令包含9个选项: (1) myls : 在缺省选项的情况下,列出当前文件夹下的普通文件(不包含隐藏文件)。 例如:当前目录包含文件home1.c, home2.c, .home3.c,输入myls后,列出的文件名为home1.c, home2.c. (2) myls –a: 列出当前文件夹下的所有文件(包含隐藏文件)。 例如:当前目录包含文件home1.c、home2.c、.home3.c,输入myls -a后,列出所有的文件名为home1.c, home2.c, .home3.c. (3) myls –l: 列出当前文件夹下普通文件的详细信息,包括文件模式,文件链接数,文件所属用户,文件所属用户组,文件大小,文件最后修改时间,文件名。并且在最后一行显示该目录下所显示的文件的文件块数。 例如:显示drwxr-xr-x 3 eli eli 4096 Nov 16 23:07 Desktop (4) myls -R 递归列出文件及其子文件。 例如:当前目录为home, 其中包含文件home1, home2, home3. 其中home1是目录文件,包含文件home11, home12, home2不是目录文件,home3是目录文件,包含文件home31, home32。 输入myls –R后,列出的文件名为 ./home: home1 home2 home3 ./home/home1: home11 home12 ./home/home3: home31 home32. (5) myls –u: 列出当前文件夹下用户x的普通文件,若输入myls -u bb,则显示所属bb的普通文件。 例如:文件home1, home2, home3属于aa,文件tmp1, tmp2, tmp3属于bb, 则若输入myls –u aa, 则显示home1,home2,home3,若输入myls -u bb, 则显示tmp1,tmp2,tmp3。 (6) myls –S: 对文件进行排序,需要输入比较参数。 myls –S 的参数包括: time——按最近修改时间排序 name——按文件名的字典序排序 size——按文件的大小从小到大排序 link——按文件链接数从少到多排序 (7) myls -1: 将当前文件夹下的文件按照一行一个的方式显示。 (8) myls –s: 在各个文件开头显示这个文件的文件块大小。 (9) myls /dirname: 显示/dirname下的文件。 编译 gcc main.c -o myls 执行 ./myls 可加若干参数,具体见上描述 程序并不完整,可能会有BUG,希望广大网友指点,交流~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值