实现ls
一、任务详情
参考伪代码实现ls的功能,提交代码的编译,运行结果截图,码云代码链接
- 打开目录文件
- 针对目录文件
- 读取目录条目
- 显示文件名
- 关闭文件目录文件
二、伪代码
opendir
while(readdir)
print d_name
closedir;
三、ls命令
ls:显示文件目录列表
-a:显示所有的文件,包括隐藏文件
-l:列出长数据串,显示出文件的属性与权限等数据信息(常用)
-i:结合-l参数列出每个文件的inode
-d:仅列出目录本身,而不是列出目录里的内容列表
四、代码
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <pwd.h>
#include <grp.h>
#include <unistd.h>
#include <string.h>
#define LS_NONE 0
#define LS_L 101
#define LS_R 102
#define LS_D 103
#define LS_I 104
#define LS_A 200
#define LS_AL (LS_A+LS_L)
#define LS_AI (LS_A+LS_I)
// 展示单个文件的详细信息
void show_file_info(char* filename, struct stat* info_p)
{
char* uid_to_name(), *ctime(), *gid_to_name(), *filemode();
void mode_to_letters();
char modestr[11];
mode_to_letters(info_p->st_mode, modestr);
printf("%s", modestr);
printf(" %4d", (int) info_p->st_nlink);
printf(" %-8s", uid_to_name(info_p->st_uid));
printf(" %-8s", gid_to_name(info_p->st_gid));
printf(" %8ld", (long) info_p->st_size);
printf(" %.12s", 4 + ctime(&info_p->st_mtime));
printf(" %s\n", filename);
}
void mode_to_letters(int mode, char str[])
{
strcpy(str, "----------");
if (S_ISDIR(mode))
{
str[0] = 'd';
}
if (S_ISCHR(mode))
{
str[0] = 'c';
}
if (S_ISBLK(mode))
{
str[0] = 'b';
}
if ((mode & S_IRUSR))
{
str[1] = 'r';
}
if ((mode & S_IWUSR))
{
str[2] = 'w';
}
if ((mode & S_IXUSR))
{
str[3] = 'x';
}
if ((mode & S_IRGRP))
{
str[4] = 'r';
}
if ((mode & S_IWGRP))
{
str[5] = 'w';
}
if ((mode & S_IXGRP))
{
str[6] = 'x';
}
if ((mode & S_IROTH))
{
str[7] = 'r';
}
if ((mode & S_IWOTH))
{
str[8] = 'w';
}
if ((mode & S_IXOTH))
{
str[9] = 'x';
}
}
char* uid_to_name(uid_t uid)
{
struct passwd* getpwuid(),* pw_ptr;
static char numstr[10];
if((pw_ptr = getpwuid(uid)) == NULL)
{
sprintf(numstr,"%d",uid);
return numstr;
}
else
{
return pw_ptr->pw_name;
}
}
char* gid_to_name(gid_t gid)
{
struct group* getgrgid(),* grp_ptr;
static char numstr[10];
if(( grp_ptr = getgrgid(gid)) == NULL)
{
sprintf(numstr,"%d",gid);
return numstr;
}
else
{
return grp_ptr->gr_name;
}
}
void do_ls(char dirname[],int mode)
{
DIR* dir_ptr;
struct dirent* direntp;
if ((dir_ptr = opendir(dirname)) == NULL)
{
fprintf(stderr, "ls2: cannot open %s \n", dirname);
}
else
{
if(mode==LS_D)
{
printf("%s\n", dirname);
}
else
{
char dirs[20][100];
int dir_count = 0;
while ((direntp = readdir(dir_ptr)) != NULL)
{
if(mode < 200 && direntp->d_name[0]=='.')
{
continue;
}
char complete_d_name[200]; // 文件的完整路径
strcpy (complete_d_name,dirname);
strcat (complete_d_name,"/");
strcat (complete_d_name,direntp->d_name);
struct stat info;
if (stat(complete_d_name, &info) == -1)
{
perror(complete_d_name);
}
else
{
if(mode == LS_L||mode == LS_AL)
{
show_file_info(direntp->d_name, &info);
}
else if(mode == LS_A||mode == LS_NONE||mode == LS_I||mode == LS_AI)
{
if(mode == LS_I||mode == LS_AI)
{
printf("%llu ", direntp->d_ino);
}
printf("%s\n", direntp->d_name);
}
else if(mode == LS_R)
{
if(S_ISDIR(info.st_mode))
{
printf("%s\n", direntp->d_name);
strcpy (dirs[dir_count],complete_d_name);
dir_count++;
}
else
{
printf("%s\n", direntp->d_name);
}
}
}
}
if(mode == LS_R)
{
int i=0;
printf("\n");
for(;i<dir_count;i++){
printf("%s:\n", dirs[i]);
do_ls(dirs[i],LS_R);
printf("\n");
}
}
}
closedir(dir_ptr);
}
}
// 解析一个单词参数,如-l,-i
int analyzeParam(char* input){
if(strlen(input)==2)
{
if(input[1]=='l') return LS_L;
if(input[1]=='a') return LS_A;
if(input[1]=='d') return LS_D;
if(input[1]=='R') return LS_R;
if(input[1]=='i') return LS_I;
}
else if(strlen(input)==3)
{
if(input[1]=='a'&& input[2]=='l') return LS_AL;
if(input[1]=='a'&& input[2]=='i') return LS_AI;
}
return -1;
}
int main(int ac,char* av[])
{
if(ac == 1)
{
do_ls(".",LS_NONE);
}
else
{
int mode = LS_NONE; // 默认为无参数ls
int have_file_param = 0; // 是否有输入文件参数
while(ac>1)
{
ac--;
av++;
int calMode = analyzeParam(*av);
if(calMode!=-1)
{
mode+=calMode;
}
else
{
have_file_param = 1;
do
{
printf("%s:\n", *av);
do_ls(*av,mode);
printf("\n");
ac--;
av++;
}while(ac>=1);
}
}
if (!have_file_param)
{
do_ls(".",mode);
}
}
}
五、运行结果

实现ls的更多相关文章
- ls: 无法访问/usr/sbin/smartctl: 没有那个文件或目录
环境:RHEL6.5 + Oracle 11.2.0.4 RAC 在安装RAC时,检查时缺少包 cvuqdisk-1.0.9-1,oracle提供脚本修复安装. 但在执行时报错: [root@orad ...
- 用C++实现Linux中shell的ls功能
实现输出当前目录下的文件名 ls功能: 方法一: #include <iostream> #include <algorithm> #include <stdio.h&g ...
- ls目录内容
ls:列出目录内容 1.常用参数: -a, –all 列出目录下的所有文件,包括以 . 开头的隐含文件(常用) -A 同-a,但不列出“.”(表示当前目录)和“..”(表示当前目录的父目录). -c ...
- Linux ls
linux.ls linux ls命令, 我觉得是所有接触linux系统, 首先学习的命令. 这个命令, 我也早就接触过了. 只是以前是学习类型的. 学了以后, 没有做到学以致用.可惜了. 现在这篇内 ...
- ls /usr/linkapp 没反应
ls /usr/linkapp ll /usr/linkapp 都是一样无反应 没有任何反应, ctrl + c / ctrl + d 都不行 但是 ls /usr/linkapp/ | wc - ...
- linux命令:ls
命令格式: ls [OPTION]... [FILE]... 功能: 列出某个目录下的文件信息,默认列出当前目录.输出结果默认按字母顺序排列. 参数: -a, --all,-A, --almost-a ...
- 每天一个linux命令(1):ls命令
1. 命令格式: ls [选项] [目录名] 2. 命令功能: 列出目标目录中所有的子目录和文件. 4. 常用范例: 例一:列出/home/peidachang文件夹下的所有文件和目录的详细资料 命令 ...
- linux中ls命令
ls跟dos下的dir命令是一样的都是用来列出目录下的文件 ls参数: -a: ls -a 列出文件下所有的文件,包括以"."开头的隐藏文件(linux下文件隐藏文件是以.开头的, ...
- Linux_用户级_常用命令(1):ls
开篇语:懒是人类进步的源动力 本文原创,专为光荣之路公众号所有,欢迎转发,但转发请务必写出处! Linux常用命令第1集包含命令:ls 一.何为常用命令 人和系统交互的指令集合,构成了shell.Sh ...
- linux-命令-ls
一.命令介绍: ls命令是linux常用的命令之一.ls用来打印当前目录的文件清单或指定目录的文件清单,也可以查看到文件的基本权限和隐藏文件. 二.命令格式: ls [OPTION]... [FILE ...
随机推荐
- 组件化思路:以selection为例子,使用prop-types实现组件化控制,重用
需求 书接上文,UI 积累之select section 这里又来两个需求了. 当我点击选择了option后,我应该看到的是我选择的option的内容 多例重用,即同样是个selection,我只是需 ...
- OC和C++混编需要注意的问题
文章首发于github.io 2018-12-17 21:01:55 方案一 1. .c文件的identify and type右边栏修改为Objective-C source 2. Built se ...
- leetcode 249 250 set和map的简单用法
leetcode249,利用了STL中的set class Solution { public: vector<int> intersection(vector<int>&am ...
- 304 Not Modified
304 Not Modified,不是服务器发出的错误,是服务器所承载的业务系统在开发时为了节省带宽和提升浏览器的体验,对GET/js,css,image等执行了缓存机制.客户端第一次对服务器发出GE ...
- win7下firefox和chrome升级到最新版之后页面打不开的解决办法
一.升级firefox到最新版后,页面崩溃,打开是空白页,连选项设置都打不开了. 最开始是我的firefox很久没升级,最近要要开始做开发,于是最让它自动升级.等升级到最新版本后,打开浏览器是结果显示 ...
- Golang package轻量级KV数据缓存——go-cache源码分析
作者:Moon-Light-Dream 出处:https://www.cnblogs.com/Moon-Light-Dream/ 转载:欢迎转载,但未经作者同意,必须保留此段声明:必须在文章中给出原文 ...
- Java反射之成员方法的反射
上一篇介绍了Java反射之成员变量的反射,这次介绍成员方法的反射. [一]Method类 Method类中封装了所有java方法的属性,包括该方法是否私有,该方法的修饰符,返回值,参数,抛的错误等等. ...
- vue列表中表单的验证
先上效果图: 在点击确认的时候会验证带有验证的字段 嵌套逻辑: 表单 表格 表格项 表单项 表单项 表格项 表格 表单 代码部分: <!-- 注意此处的model,需要一个对象,而我们的数据是一 ...
- (转)windows宿主机,ubuntu虚拟机下的上网设置(有线网络和无线网络)
转自:http://hi.baidu.com/puppywst/item/d9f73734856e2af32684f4e3 虚拟机下ubuntu共享方式上网: 有线网络 在有线网络的条件下,vmwar ...
- Nginx 入门及基本命令行操作
Nginx 介绍 Nginx 是一个高性能的 Web 服务器,从 2001 年发展至今,由于 Nginx 对硬件和操作系统内核特性的深度挖掘,使得在保持高并发的同时还能够保持高吞吐量.Nginx 还采 ...