首页 > 其他分享 >改进ls实验

改进ls实验

时间:2022-10-12 20:35:41浏览次数:72  
标签:文件 调用 是否是 st 改进 实验 mode ls

改进要求

  1. 排序:文件名读入数组,利用qsort排序
  2. 分栏:文件名读入数组,计算列宽和行高
  3. .和..加入-a选项,没有-a,不显示隐藏文件
  4. -l:功能不同,单独实现

首先我们来看一下ls -l的具体功能:

可见陈列出了所有输出信息,是用单列格式输出的,不输出为多列
根据要求编写代码
码云链接如下:
https://gitee.com/wang-jingspm/wjls

运行结果:

输入命令./upls -a
    在原来的ls -a中,加上-a后显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为隐藏,不会列出)。

输入命令 ./upls -l

可见显示出了所有信息,包括使用者的权限、修改日期、使用者身份等,且都是以列的形式显示的。

代码分析

1.实现排序部分




    首先用opendir系统调用打开目录,获取目录下的文件总数,定义一个g_maxlen,在反复赋值替换中获取最长的文件名,其中文件个数最大值设置为256个。
    其次获取目录下所有的文件名称。调用dirent结构体,获取文件名称。
这里我们调用了C语言库中的strncpy函数:
char *strncpy(char *dest, const char *src, size_t n)
    把src所指向的字符串复制到dest,最多复制n个字符。当src的长度小于n时,dest的剩余部分将用空字节填充。该函数能够返回最终复制后的字符串。代码中的含义即为将path指针所指向的字符串复制到创建的文件夹filename[]里,长度是路径指针所指的文件名字的长度。调用dirent结构体来获取文件名字。
    排序即逐个比较文件名的字符大小,较小的放在数组低位置,较大的放置在数组高位置。这里调用了较为简单的排序方法,实现对文件名的排序。
2.实现分栏部分
这里我们定义了一个宏常量int g_leave_len = MAXROWLEN,用于实现输出对齐

3.实现-a -l部分

   param[32]是一个保存命令行参数的数组,这里的PARAM_A和PARAM_L的宏定义分别是1和2,用来根据命令行的输入(是a还是l)做选择判断,调用不同的函数实现

   这里实现了-l 的功能,获取文件类型,这里调用了stat结构体的内容,输出文件的相关信息:

struct stat {
dev_t st_dev; /* 文件所在设备的标识 */
ino_t st_ino; /* 文件结点号 */
mode_t st_mode; /* 文件保护模式 */
nlink_t st_nlink; /* 硬连接数 */
uid_t st_uid; /* 文件用户标识 */
gid_t st_gid; /* 文件用户组标识 */
dev_t st_rdev; /* 文件所表示的特殊设备文件的设备标识 */
off_t st_size; /* 总大小,单位为字节*/
blksize_t st_blksize; /* 文件系统的块大小 */
blkcnt_t st_blocks; /* 分配给文件的块的数量,512字节为单元 */
time_t st_atime; /* 最后访问时间 */
time_t st_mtime; /* 最后修改时间 */
time_t st_ctime; /* 最后状态改变时间 */
};

   我们来判断文件类型,常常使用这几个宏:

  • S_ISLNK(st_mode):是否是一个连接.
  • S_ISREG(st_mode):是否是一个常规文件.
  • S_ISDIR(st_mode):是否是一个目录
  • S_ISCHR(st_mode):是否是一个字符设备.
  • S_ISBLK(st_mode):是否是一个块设备
  • S_ISFIFO(st_mode):是否 是一个FIFO文件.
  • S_ISSOCK(st_mode):是否是一个SOCKET文件

   我们使用最多的属性是st_mode如果返回真,代表是目录或者连接等等

标签:文件,调用,是否是,st,改进,实验,mode,ls
From: https://www.cnblogs.com/ssssspm/p/16782523.html

相关文章

  • 实验1c语言开发环境使用和数据类型,运算符和表达式
    1.试验任务1(1)在垂直方向上打印两个字符小人的源代码,以及运行结果截图 \\在垂直方向上打印两个字符小人#include<stdio.h>intmain(){printf("o\n");pr......
  • 实验4:开源控制器实践——OpenDaylight
    实验4:开源控制器实践——OpenDaylight一、实验目的能够独立完成OpenDaylight控制器的安装配置;能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环境Ub......
  • 实验2 类和对象(2)
    实验目的能够使用C++语法规则正确定义、实现、测试类。能够使用C++语法规则正确创建对象,并基于对象编程。知道类的static成员用于解决什么问题场景,会正确使用c++语法规......
  • 实验1
    task1_1源代码#include<stdio.h>intmain(){printf("O\n");printf("<H>\n");printf("II\n\n\n");printf("O\n");printf("<H>\n")......
  • 实验4:开源控制器实践——OpenDaylight
    实验4:开源控制器实践——OpenDaylight一、实验目的能够独立完成OpenDaylight控制器的安装配置;能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环境U......
  • 实验二 类和对象(2)
    实验结论task4Complex.hpp#include<iostream>#include<math.h>usingnamespacestd;classComplex{public:Complex(doublex=0,doubley=......
  • 0day安全:软件漏洞技术分析-Crack小实验
    Crack小实验#include<stdio.h>#definePASSWORD"1234567"intverify_password(char*password){ intauthenticated; authenticated=strcmp(password,PASSWORD)......
  • 实验二
    1#pragmaonce2#include<iostream>3#include<cmath>4usingnamespacestd;5classComplex6{7friendComplexadd(Complexc1,Complexc2);......
  • 实验二 类和对象
    #include<iostream>#include<cmath>usingnamespacestd;classComplex{public:Complex(doublea=0,doubleb=0):real{a},imag{b}{};Complex(......
  • 实验4:开源控制器实践——OpenDaylight
    实验4:开源控制器实践——OpenDaylight一、实验目的能够独立完成OpenDaylight控制器的安装配置;能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环境......