实现linux ls-l,实现Linux下的ls和ls-l

ls的C语言代码实现

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define PARAM_NONE 0 //无参数

#define PARAM_A 1 //-a

#define PARAM_L 2 //-l

#define MAXROWLEN 80 //一行最多显示的字符数

int g_leave_len = MAXROWLEN; //一行是剩余长度,用于输出对齐

int g_maxlen; //存放某目录下最长文件名的长度

void my_error(const char* errstring, int line)

{

fprintf(stderr,"line:%d",line);

perror(errstring);

exit();

}

//打印单个文件,且没有-l参数

void display_single(char *name)

{

int i,len;

//如果本行不足以打印一个文件名则换行

if(g_leave_len < g_maxlen)

{

printf("\n");

g_leave_len = MAXROWLEN;

}

len = strlen(name);

len = g_maxlen - len;

printf("%-s",name);

;i

{

printf(" ");

}

printf(" ");

g_leave_len = g_leave_len - g_maxlen - ;

}

/*获取文件属性并打印*/

void display_attribute(struct stat buf, char *name)

{

];

struct passwd *psd;

struct group *grp;

//获取文件类型

if(S_ISLNK(buf.st_mode))

printf(");

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))

printf("f");

else if(S_ISSOCK(buf.st_mode))

printf("s");

//获取文件权限

if(buf.st_mode & S_IRUSR)

printf("r");

else

printf("-");

if(buf.st_mode & S_IWUSR)

printf("w");

else

printf("-");

if(buf.st_mode & S_IXUSR)

printf("x");

else

printf("-");

if(buf.st_mode & S_IRGRP)

printf("r");

else

printf("-");

if(buf.st_mode & S_IWGRP)

printf("w");

else

printf("-");

if(buf.st_mode & S_IXGRP)

printf("x");

else

printf("-");

if(buf.st_mode & S_IROTH)

printf("r");

else

printf("-");

if(buf.st_mode & S_IWOTH)

printf("w");

else

printf("-");

if(buf.st_mode & S_IXOTH)

printf("x");

else

printf("-");

printf(" ");

//根据uid和gid获取文件所有者的用户名于组名

psd = getpwuid(buf.st_uid);

grp = getgrgid(buf.st_gid);

printf("%4d",buf.st_nlink);

printf("%-8s",psd->pw_name);

printf("%-9s",grp->gr_name);

printf("%6d",buf.st_size);

strcpy(buf_time, ctime(&buf.st_mtime));//将格林位置时间转化成正常时间格式

buf_time[strlen(buf_time) - ] = ;

printf(" %s",buf_time);

}

//根据flag参数显示文件内容,调用display_single或者display_attribute

void display(int flag,char *pathname)

{

int i,j;

struct stat buf;

];

,j=;i

{

if(pathname[i] == '/')

{

j = ;

}

else

name[j++] = pathname[i];

}

name[j] = ;

)

{

my_error("stat",__LINE__);

}

if(flag == PARAM_NONE)

{

] != '.')//不显示隐藏文件

{

display_single(name);

}

}

else if(flag == PARAM_A)

{

display_single(name);

}

else if(flag == PARAM_L)

{

] != '.')

{

display_attribute(buf,name);

printf(" %-s\n",name);

}

}

else if(flag == (PARAM_A | PARAM_L))

{

display_attribute(buf,name);

printf(" %-s\n",name);

}

}

void display_dir(int flag_param,const char *path)

{

DIR* dir;

struct dirent* dirent;

][PATH_MAX+],temp[PATH_MAX+];

;//总共有多少个文件

if((dir = opendir(path)) == NULL)

{

my_error("opendir",__LINE__);

}

//获取文件总数和最长文件名

while((dirent = readdir(dir)) != NULL)

{

if(g_maxlen < strlen(dirent->d_name))

g_maxlen = strlen(dirent->d_name);

count++;

}

closedir(dir);

)

my_error("文件太多超过了256个",__LINE__);

int i,j,len = strlen(path);

//获取目录下所有的文件名

dir = opendir(path);

;i

{

dirent = readdir(dir);

if(dirent == NULL)

{

my_error("readdir",__LINE__);

}

strncpy(filenames[i],path,len);

filenames[i][len] = ;

strcat(filenames[i],dirent->d_name);

filenames[i][len+strlen(dirent->d_name)] = ;

}

//对文件名进行排序

;i

;j

{

)

{

strcpy(temp,filenames[j]);

strcpy(filenames[j] , filenames[i]);

strcpy(filenames[i] , temp);

}

}

;i

display(flag_param,filenames[i]);

closedir(dir);

//没有-l的话打印一个换行符

)

printf("\n");

}

int main(int argc, char **argv)

{

int i,j,k;

int num;//记录-的个数

];

]; // 保存命令行参数

int flag_param = PARAM_NONE;

struct stat buf;

j = ;

num = ;

;i

{

] == '-')

{

;k

{

param[j] = argv[i][k];

j++;

}

num++;

}

}

//现在只支持-a和-l参数

;i

{

if(param[i] == 'a')

{

flag_param |= PARAM_A;

}

else if(param[i] == 'l')

{

flag_param |= PARAM_L;

}

else

{

printf("错误的参数:%c\n",param[i]);

exit();

}

}

param[j] = ;

//如果没有输入文件名或者目录,就显示当前目录

) == argc)

{

strcpy(path,"./");

path[] = ;

display_dir(flag_param,path);

;

}

i = ;

;i

{

] != '-')

{

strcpy(path,argv[i]);

)

my_error("stat",__LINE__);

if(S_ISDIR(buf.st_mode))

{

//判断目录是否以/结尾

] != '/')

{

path[strlen(argv[i])] = '/';

path[strlen(argv[i] + )] = ;

}

else

path[strlen(argv[i])] = ;

display_dir(flag_param,path);

}

else

{

display(flag_param,path);

}

}

}

;

}

截图:

bdf5f9fcac4ae62350f1c001bbdf8623.png

Linux下ll命令与ls -l

还大三Linux课的债. 1.ll命令用于显示当前文件下非隐藏文件的详情 查询结果分为7栏: 1)如' -rw-r--r--' 表示三种用户对该文件的不同权限: r:可读:w:可写:x:可执行 其中第 ...

linux 下用 c 实现 ls -l 命令

#include #include #include #include

linux下 解释 终端命令 ls -al或者ls -li 输出的信息

$ ls -al            drwxr-xr-x.            wjshan0808    wjshan0808        Sep :    .cache $ ls -li ...

linux下用c实现ls命令

struct dirent中的几个成员: d_type:4表示为目录,8表示为文件 d_reclen:16表示子目录或文件,24表示非子目录 d_name:目录或文件的名称 #include < ...

Linux 下的基本命令

Linux 下的基本命令 1. ls 命令 格式 : ls [OPTION]... [FILE]... 用途 : 显示目录下的内容 [OPTION] : -l : 列出详细信息 -d : 显示目录本身 ...

linux 下ln命令--笔记

linux 下ln命令 ln命令用来为文件创建连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接.如果要创建符号连接必须使用"-s"选项.注意:符号链接文件不是一个独立 ...

实现Linux下的ls -l命令

基本实现了Linux下的ls -l命令,对于不同的文件显示不同的颜色和显示符号链接暂时没有实现: /************************************************** ...

linux下ls -l命令(即ll命令)查看文件的显示结果分析

在linux下使用“ls -l”或者“ls -al”或者“ll”命令查看文件及目录详情时,shell中会显示出好几列的信息.平时也没怎么注意过,今天忽然心血来潮想了解一下,于是整理了这篇博客,以供参考 ...

随机推荐

虚拟机下安装ubuntu后root密码设置

ctrl+alt+t:调出命令行. 问题描述: 在虚拟机下安装了ubuntu中要输入用户名,一般情况下大家都会输入一个自己的网名或绰号之类的,密码也在这时设置过了. 但是当安装成功之后,使用命令#su ...

LeetCode Excel Sheet Column Title (输出excel表的列名称)

题意:给一个数字n,输出excel表的列名称. 思路:其实观察可知道,是个26进制的标记而已.那就模拟一下,每次计算一位时就先左移1位,再进行计算. class Solution { public: ...

php 链接access数据库

php链接access数据库代码 <?php $odbc = "Driver={Microsoft Access Driver (*.mdb)};Dbq=".realpath ...

一个好用的hash函数(C语言)

typedef unsigned int DWORD; typedef unsigned char BYTE; /******************************************* ...

Namespace&colon;Openstack的网络实现

前言:众所周知在linux系统中PID.IPC.Network等都是全局性的资源,不论什么的改动和删减都会对整个系统造成影响.这也是为什么kvm之类的虚拟化技术须要模拟一个完毕主机系统的原因. 可是. ...

关于APIcloud中的登录与注册的简单实现

1.apiclou实现页面的登录方式,不适用自带的登录. html代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值