linuxnbsp;下myls实现
作者:心梦无痕
完成时间2013 .7 .26
程序主体思路来自,linuxc 编程实战 自己实现ls
find(); 除外
分析原代碼的一些感悟,该程序将命令行中的参数转化为宏(以数字替换)
--1.#define PARAM_NONE 0 在main函数中,int flag=PARAM_NONE ;得到flag时,
通过判断,参数赋值给flag
flag|=(定义过该代表命令的宏)
有 0|x==x;
获得命令参数标志
如有多个选项直接讨论他们相加的情况,避免了直接对,选项名的讨论。
--2.定义了每一行容纳长度的宏
当前行的占用长度,以此作为衡量尺度判断,该文件名应该放到该行还是下一行。
再问件名间打印固定的空格数,(也可定义为宏);
如果使用固定个数打印,如果某行文件名较长的话,就不能显示全文件名;
然而该方法会自动将其放到下一行打印
=============================================================================================================================================================================
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>
#include <dirent.h>
#include <pwd.h>
#include <grp.h>
#include <errno.h>
#include <string.h>
#define PARAM_NONE 0 //无参数
#define PARAM_A 1 //-a
#define PARAM_L 2 //-l
#define PARAM_R 10
#define MAXROWLEN 80//一行显示的最多字数
int sys_leave=MAXROWLEN;
int sys_maxlen;
void show_attribute(struct stat buf,char* filename);
void display(int flag,char* pathname);
void show_ruler(char *);
void find_all(char* dirnamex)
{
DIR * dir=NULL;
char dirname[1024];
char dirlist[256][1204];
struct dirent * ptr;
struct stat st;
int i=0,j=0;
char path1[512];
puts(dirnamex);
chdir(dirnamex);
getwd(dirname);
printf("dir:%s\n",dirname);
if((dir=opendir("./"))==NULL)
{
printf("null");
return ;
}
i=0;
while((ptr=readdir(dir))!=NULL)
{
if(stat(ptr->d_name,&st)==-1)
{
perror("error name");
}
if(strcmp(ptr->d_name,".")&&strcmp(ptr->d_name,".."))
{
//puts(ptr->d_name);
show_ruler(ptr->d_name);
if(S_ISDIR(st.st_mode))
{
strcpy(dirlist[i++],ptr->d_name);
}
}
}
for(j=0;j<i;j++)
{
find_all(dirlist[j]);
}
//回到上层目录,将其设置为工作目录
chdir("..");
}
void display_dir(int flag,char* path)
{
DIR* dir;
struct dirent* ptr;
int count;
char filename[256][PATH_MAX+1],temp[PATH_MAX+1];
int i,j,len;
dir=opendir(path);
if(dir==NULL)
{
exit(1);
}
while((ptr=readdir(dir))!=NULL)
{
if(sys_maxlen<strlen(ptr->d_name))
sys_maxlen=strlen(ptr->d_name);
count++;
}
closedir(dir);
if(count>256)
{
printf("too lage\n");
exit(1);
}
len=strlen(path);
dir=opendir(path);
for(i=0;i<count;i++)
{
ptr=readdir(dir);
if(ptr==NULL)
{
printf("readdir\n");
exit(1);
}
strncpy(filename[i],path,len);
filename[i][len]='\0';
strcat(filename[i],ptr->d_name);
filename[i][strlen(ptr->d_name)+len]='\0';
}
for(i=0;i<count-1;i++)
{
for(j=0;j<count-1-i;j++)
{
if(strcmp(filename[j],filename[j+1])>0)
{
strcpy(temp,filename[j+1]);
temp[strlen(filename[j+1])]='\0';
strcpy(filename[j+1],filename[j]);
filename[j+1][strlen(filename[j])]='\0';
strcpy(filename[j],temp);
filename[j][strlen(temp)]='\0';
}
}
}
for(i=0;i<count;i++)
{
display(flag,filename[i]);
}
closedir(dir);
if((flag&PARAM_L)==0)
printf("\n");
}
void show_error(char* errorcase,int len)
{
fprintf(stderr,"len:%d",len);
perror(errorcase);
exit(1);
}
void show_ruler(char* filename)
{
int i,len;
if(sys_leave<sys_maxlen)
{
//新行开始,预留回复
printf("\n");
sys_leave=MAXROWLEN;
}
//获得长度
len=strlen(filename);
//获得空格数
len=sys_maxlen-len;
printf("%-s",filename);
for(i=0;i<len;i++)
{
printf(" ");
}
printf(" ");
sys_leave-=sys_maxlen;
sys_leave-=2;
}
void display(int flag,char* pathname)
{
int i,j;
char filename[NAME_MAX+1];
struct stat filestat;
//for(i=0,j=0;*(pathname+i)!="\0";i++)
for(i=0,j=0;i<strlen(pathname);i++)
{
if(*(pathname+i)=='/')
{
continue;
j=0;
}
filename[j++]=*(pathname+i);
}
filename[j]='\0';
strcpy(filename,filename+1);
if(lstat(pathname,&filestat)==-1)
{
show_error("setstat",__LINE__);
}
switch(flag)
{
case PARAM_NONE:
if(filename[0]!='.')
{
show_ruler(filename);
}
break;
case PARAM_A:
show_ruler(filename);
break;
case PARAM_L:
if(filename[0]!='.')
{
show_attribute(filestat,filename);
printf(" %s\n",filename);
}
break;
case PARAM_A+PARAM_L:
{
show_attribute(filestat,filename);
printf(" %s\n",filename);
}
break;
case PARAM_R:
find_all(filename);
break;
default :
break;
}
}
void show_attribute(struct stat buf,char* filename)
{
//时间的格式位数
char buf_time[32];
struct passwd *password;
struct group *grp;
if(S_ISLNK(buf.st_mode))
{
printf("1");
}
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_IRGRP){
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(" ");
password=getpwuid(buf.st_uid);
grp=getgrgid(buf.st_gid);
printf("M",(int)buf.st_nlink);
printf("%-8s",password->pw_name);
printf("%-8s",grp->gr_name);
printf("m",(int)buf.st_size);
strcpy(buf_time,ctime(&buf.st_mtime));
buf_time[strlen(buf_time)-1]='\0';
printf(" %s",buf_time);
}
void main(int argc,char** argv)
{
int i,j,k,num;
char path[PATH_MAX+1];
char param[32];
int flag_param=PARAM_NONE;
struct stat buf;
j=0;
num=0;
for(i=1;i<argc;i++){
if(argv[i][0]=='-'){
for(k=1;k<strlen(argv[i]);k++,j++){
param[j]=argv[i][k];
}
num++; //- count
}
}
for(i=0;i<j;i++)
{
if(param[i]=='a'){
flag_param|=PARAM_A;
continue;
}else if(param[i]=='l'){
flag_param|=PARAM_L;
continue;
}
else if(param[i]=='R')
{
flag_param|=PARAM_R;
}
else
{
printf("my ls :invalid option %c\n",param[i]);
exit(1);
}
}
param[j]='\0';
if(num+1==argc)
{
strcpy(path,"./");
path[2]='\0';
display_dir(flag_param,path);
return;
}
i=1;
do{
if(argv[i][0]=='-'){
i++;
continue;
}else{
strcpy(path,argv[i]);
//not dir or file showerror
if(stat(path,&buf)==-1)
{
show_error("stat",__LINE__);
}
if(S_ISDIR(buf.st_mode)){
if(path[strlen(argv[i])-1]!='/'){
path[strlen(argv[i])-1]='/';
path[strlen(argv[i])+1]='\0';
}else{
path[strlen(argv[i])]='\0';
}
display_dir(flag_param,path);
i++;
}
else {
display(flag_param,path);
i++;
}
}
}while(i<argc);
}
linuxnbsp;下myls实现相关推荐
- linuxnbsp;下一键移植nbsp;乐蛙/…
我比较懒,一般工作都是脚本做,工作要求,做些移植,顺手写了一个一键移植脚本,都是些简单的命令,供菜鸟和懒鬼使用.几天下来,移植的ROM没发现大BUG,so,发到网上方便其他懒鬼使用.大神勿喷 准备: ...
- 乘风聚合图床源码 多接口
文章目录[隐藏] 源码介绍 源码截图 源码介绍 纯PHP源码无后台,有能力自己加后台,非常简约精美,11个接口,大部分都可以使用.代码全开源无加密! 源码截图 附 件 下 载 文件名称:乘风聚合图床源 ...
- 数据库(DataBase)
MySQL 简介 数据库 数据库:DataBase,简称 DB,存储和管理数据的仓库 数据库的优势: 可以持久化存储数据 方便存储和管理数据 使用了统一的方式操作数据库 SQL 数据库.数据表.数据的 ...
- 初步了解mac下C源码的编译过程
初步了解mac下C源码的编译过程 参考: 请问Mac OS X (10.9.1)下创建和使用动态链接库的方法 cc.gcc.g++.CC的区别概括 - 今晚打酱油_ - 博客园 Linux 下 的 c ...
- linux 下动手实现bash -lR 命令
具体思路以后再补, 先给出代码: #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> ...
- linux下文件压缩、解压缩方法(tar)
注: 1.以下测试在ubuntu 9.10(32位)上进行,其他平台未测试 2.本文只是我个人的理解,不一定完全正确 3.版权所有,转载请注明作者和出处 压缩 1.压缩的概念 1)压缩的目的: ...
- golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用
RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...
- Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几
Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...
- 过滤Linux下不同大小的文件,linux查找当前目录下 M/G 大小的文件,删除Linux下指定大小的文件
过滤Linux下不同大小的文件,linux查找当前目录下 M/G 大小的文件,删除Linux下指定大小的文件 find ./ -type f -size +1G| xargs rm 在清理系统日志文件 ...
最新文章
- Hive中文注释乱码解决方案
- 释疑の资源短缺DATASET_CANT_CLOSE
- 控件(View)之TextSwitcher, Gallery, ImageSwitcher, GridView, ListView, ExpandableList【转】
- RabbitMQ基本概念(三)-Centos7下安装RabbitMQ3.6.1
- linux中线程的挂起与恢复(进程暂停)
- Exchange 服务器可支持性矩阵
- fastdfs笔记_fastdfs基于group的扩容
- Treap树(堆树)
- 学习AJAX,解析XMLHttpRequest对象
- 黑客游戏未发先被黑:游戏开发商Ubisoft 和 Crytek遭勒索攻击
- spring-cloud-sleuth 和 分布式链路跟踪系统
- 关于SetTimer函数的总结
- python合并两个文本文件内容_Python将多个txt文本合并为一个文本的代码
- 网络硬件三剑客的集线器(Hub)、交换机(Switch)与路由器(Router)
- 遇见逆水寒服务器维护时间,《遇见逆水寒》7月23日更新公告
- 介绍一个产品的思维导图_产品经理可以用思维导图做什么?
- 如何阅读一本书 笔记
- 2018世界人工智能大会总结
- ansys workbench17.0 lsdyna模块设置时间步长
- Invalid project description
热门文章
- 如果老板跟你说“爱干就干,不爱干就滚蛋”,你会怎么办?
- 使用bootstrap搭建后台管理系统页面《一》
- 英伟达FXAA抗锯齿性能实测、画质对比
- 桌面html布局,利用自定义桌面和HTML打造动态桌面图标
- 解决Attempt to invoke virtual method '...ListAdapter'on a null object reference
- 单片微型计算机原理及应用第三版答案胡乾斌,单片微型计算机原理-胡乾斌--课后习题答案...
- [实例分割] SOLO: Segmenting Objects by Locations 论文阅读
- ctfshow 网络迷踪-爆破不了
- 在Word 中用C#查找Wingdings符号
- AppCan4.0:开发者要做有价值的APP