版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、linux c模拟ls指令详解_ 本篇文章是对linux中基于c模拟ls指令的实现方法进行了具体的分析介绍,需要的伴侣参考下 代码如下: /* 模拟ls指令,实现参数-tariRl.有些代码重复消失,可改进 可以在该程序的基础上增加参数,该程序思路清楚,简单扩展 */ #includestdio.h #includestring.h #includestdlib.h #includesys/types.h #includeunistd.h #includesys/stat.h #includedirent.h #includesys/ioctl.h #includepwd.h #include
2、grp.h #define LL (10) /*带l参数标记*/ #define IL (11) /*带i参数标记*/ #define RU (12) /*带R参数标记*/ #define TL (116) /*带t参数标记*/ #define AL (117) /*带a参数标记*/ #define RL (118) /*带r参数标记*/ #define LENGTH 500 /*字符串最大长度*/ #define MAX_FILE_COUNT 500/*文件列表最大长度*/ /*函数声明*/ void error(char* error_message,int line); void dis
3、play(struct stat* stalist,char (*namelist)LENGTH,int n,int mode); int file_list(char* path,struct stat* stalist,char (*namelist)LENGTH,int mode); void display_simply(char (*namelist)LENGTH,int n); void display_LL(struct stat * stalist,char (*namelist)LENGTH,int n); void display_IL(struct stat * stal
4、ist,char (*namelist)LENGTH,int n); void display_LL_IL(struct stat * stalist,char (*namelist)LENGTH,int n); void display_RU(struct stat* stalist,char (*namelist)LENGTH,int n,int mode); void display_RU_LL(struct stat * stalist,char (*namelist)LENGTH,int n,int mode); void display_RU_IL(struct stat* sta
5、list,char (*namelist)LENGTH,int n,int mode); void display_RU_IL_LL(struct stat * stalist,char (*namelist)LENGTH,int n,int mode); /*主函数*/ int main(int argc,char *argv) int i,j; /*mode的前16个位用来标记那些能影响显示的参数,16位之后的位用来标记不影响输出格式的参数。这个程序只用到了0-3位,16-18位,假如要在该程序的基础上增加参数,可以用其他没有用法的位。 mode的第0位为1表示带l参数,mode的第1位为
6、1表示带i参数,mode的第2位为1表示带R参数,mode的第16位为1表示带t参数,mode的第17位为1表示带a参数,mode的第18位为1表示带r参数*/ int mode=0; char error_messageLENGTH=0;/*错误信息*/ char pathLENGTH=0;/*路径*/ struct stat stalistMAX_FILE_COUNT;/*文件具体信息数组*/ char namelistMAX_FILE_COUNTLENGTH;/*文件名数组*/ int flag=0;/*推断是否指定了名目*/ int count;/*文件个数*/ /*解析参数*/ fo
7、r(i=1;iargc;i+) if(argvi0=-)/*假如是选项参数*/ for(j=1;jstrlen(argvi);j+) if(argvij=l) mode=mode|LL; else if(argvij=i) mode=mode|IL; else if(argvij=R) mode=mode|RU; else if(argvij=r) mode=mode|RL; else if(argvij=a) mode=mode|AL; else if(argvij=t) mode=mode|TL; else snprintf(error_message,LENGTH,no option o
8、f %c,argvij); error(error_message,_LINE_); else/*参数为名目或文件*/ if(flag=1) error(can not specify more then two dir or file,_LINE_); else flag=1; if(argvi0!=/)/*相对路径*/ strcat(path,get_current_dir_name(); strcat(path,/); strncat(path,argvi,strlen(argvi); else/*肯定路径*/ strcpy(path,argvi); if(flag=0)/*未指定任何名
9、目或文件,则用法默认当前名目*/ strcat(path,get_current_dir_name(); /*依据mode猎取指定名目下的文件*/ count=file_list(path,stalist,namelist,mode); /*依据mode显示文件*/ display(stalist,namelist,count,mode); return 0; /*猎取文件列表*/ int file_list(char* path,struct stat* stalist,char (*namelist)LENGTH,int mode) int i=0,index,j,k; DIR *dir;
10、 struct dirent *ptr; char strLENGTH; char nametempLENGTH; struct stat statemp; if(stat(path,stalist0)0) / puts(path); error(the specify file is not exist,_LINE_); if(S_ISDIR(stalist0.st_mode)/*假如该路径指向的是一个名目*/ if(dir=opendir(path)=NULL)/*打开名目*/ sprintf(str,can not open %s,path); error(str,_LINE_); ch
11、dir(path);/*转变当前工作名目到path*/ i=0; while(ptr=readdir(dir)!=NULL)/*依次读取名目下的全部文件*/ if(ptr-d_name0=. !(mode AL)/*忽视隐蔽文件*/ continue; /*按字母挨次插入到stalist数组及namelist数组*/ for(j=i;j0;j-) if(strcmp(ptr-d_name,namelistj-1)0) break; for(k=i;kj;k-) strcpy(namelistk,namelistk-1); stalistk=stalistk-1; strcpy(namelist
12、j,ptr-d_name); stat(ptr-d_name,stalistj); i+; if(i=MAX_FILE_COUNT) error(file count beyond MAX_FILE_COUNT,_LINE_); closedir(dir); else j=strlen(path)-1; while(j=0 pathj!=/) j-; if(j0) error(path error,_LINE_); j+; k=0; while(pathj) namelist0k=pathj; j+; k+; namelist0k=0; return 1; if(mode TL)/*按文件修改
13、时间排序*/ for(j=0;ji;j+) index=j; for(k=j+1;ki;k+) if(stalistindex.st_mtimestalistk.st_mtime) index=k; statemp=stalistj; stalistj=stalistindex; stalistindex=statemp; strcpy(nametemp,namelistj); strcpy(namelistj,namelistindex); strcpy(namelistindex,nametemp); if(mode RL)/*反序排列*/ for(j=0;ji/2;j+) strcpy(
14、nametemp,namelistj); strcpy(namelistj,namelisti-j-1); strcpy(namelisti-j-1,nametemp); statemp=stalistj; stalistj=stalisti-j-1; stalisti-j-1=statemp; return i; /*依据mode选择不同的函数进行显示*/ void display(struct stat* stalist,char (*namelist)LENGTH,int n,int mode) /*使mode的高16位为0*/ int m = mode (116)-1); switch
15、(m) case 0: display_simply(namelist,n); break; case 1: display_LL(stalist,namelist,n); break; case 2: display_IL(stalist,namelist,n); break; case 3: display_LL_IL(stalist,namelist,n); break; case 4: display_RU(stalist,namelist,n,mode); break; case 5: display_RU_LL(stalist,namelist,n,mode); break; ca
16、se 6: display_RU_IL(stalist,namelist,n,mode); break; case 7: display_RU_IL_LL(stalist,namelist,n,mode); break; /*不带显示选项,简洁显示文件名*/ void display_simply(char (*namelist)LENGTH,int n) int i,maxlength=0,cols; struct winsize ts; for(i=0;in;i+) if(strlen(namelisti)maxlength) maxlength=strlen(namelisti); /*
17、猎取终端的大小*/ ioctl(STDIN_FILENO,TIOCGWINSZ,ts); cols=ts.ws_col; cols/=(maxlength+1); /lines=ts.ws_row; for(i=0;in;i+) if(i!=0 i%cols=0) puts(); printf(%*s,-(maxlength+1),namelisti); putchar(n); /*-l 参数,显示具体文件信息*/ void display_LL(struct stat * stalist,char (*namelist)LENGTH,int n) int i,mode; char* str;
18、 for(i=0;in;i+) mode=stalisti.st_mode; if(S_ISDIR(mode) printf(d); else printf(-); if(mode (18) printf(r); else printf(-); if(mode (17) printf(w); else printf(-); if(mode (16) printf(x); else printf(-); if(mode (15) printf(r); else printf(-); if(mode (14) printf(w); else printf(-); if(mode (13) prin
19、tf(x); else printf(-); if(mode (12) printf(r); else printf(-); if(mode (11) printf(w); else printf(-); if(mode (10) printf(x); else printf(-); printf( %-3d,stalisti.st_nlink); printf( %-6s,getpwuid(stalisti.st_uid)-pw_name); printf( %-6s,getgrgid(stalisti.st_gid)-gr_name); printf( %-10d,stalisti.st_
20、size); str=ctime(stalisti.st_mtime); strstrlen(str)-2=0; printf( %s,str); printf( %sn,namelisti); /*-i 参数,显示文件名及节点号*/ void display_IL(struct stat* stalist,char (*namelist)LENGTH,int n) int i,maxlength=0,cols; struct winsize ts; for(i=0;in;i+) if(strlen(namelisti)maxlength) maxlength=strlen(namelisti
21、); /*猎取终端的大小*/ ioctl(STDIN_FILENO,TIOCGWINSZ,ts); cols=ts.ws_col; cols/=(maxlength+9); /lines=ts.ws_row; for(i=0;in;i+) if(i!=0 i%cols=0) puts(); printf(%-8d ,stalisti.st_ino); printf(%*s,-(maxlength+1),namelisti); putchar(n); /*-li 参数,显示具体文件信息和节点号*/ void display_LL_IL(struct stat * stalist,char (*n
22、amelist)LENGTH,int n) int i,mode; char* str; for(i=0;in;i+) printf(%-8d ,stalisti.st_ino); mode=stalisti.st_mode; if(S_ISDIR(mode) printf(d); else printf(-); if(mode (18) printf(r); else printf(-); if(mode (17) printf(w); else printf(-); if(mode (16) printf(x); else printf(-); if(mode (15) printf(r)
23、; else printf(-); if(mode (14) printf(w); else printf(-); if(mode (13) printf(x); else printf(-); if(mode (12) printf(r); else printf(-); if(mode (11) printf(w); else printf(-); if(mode (10) printf(x); else printf(-); printf( %-3d,stalisti.st_nlink); printf( %-6s,getpwuid(stalisti.st_uid)-pw_name);
24、printf( %-6s,getgrgid(stalisti.st_gid)-gr_name); printf( %-10d,stalisti.st_size); str=ctime(stalisti.st_mtime); strstrlen(str)-2=0; printf( %s,str); printf( %sn,namelisti); /*-R 参数,简洁显示全部文件,包括名目下面的子名目*/ void display_RU(struct stat* stalist,char (*namelist)LENGTH,int n,int mode) int i,count; char pat
25、hLENGTH=0,tempLENGTH=0; struct stat staMAX_FILE_COUNT; char nameMAX_FILE_COUNTLENGTH; puts(get_current_dir_name(); display_simply(namelist,n); putchar(n); strcpy(path,get_current_dir_name(); for(i=0;in;i+) if(strcmp(namelisti,.)=0 | strcmp(namelisti,.)=0) continue; if(S_ISDIR(stalisti.st_mode) strcp
26、y(temp,path); strcat(path,/); strcat(path,namelisti); count=file_list(path,sta,name,mode); display_RU(sta,name,count,mode); strcpy(path,temp); /*-Rl 参数,显示全部文件,包括名目下面的子名目的具体信息*/ void display_RU_LL(struct stat * stalist,char (*namelist)LENGTH,int n,int mode) int i,count; char pathLENGTH=0,tempLENGTH=0
27、; struct stat staMAX_FILE_COUNT; char nameMAX_FILE_COUNTLENGTH; puts(get_current_dir_name(); display_LL(stalist,namelist,n); putchar(n); strcpy(path,get_current_dir_name(); for(i=0;in;i+) if(strcmp(namelisti,.)=0 | strcmp(namelisti,.)=0) continue; if(S_ISDIR(stalisti.st_mode) strcpy(temp,path); strc
28、at(path,/); strcat(path,namelisti); count=file_list(path,sta,name,mode); display_RU_LL(sta,name,count,mode); strcpy(path,temp); /*-Ri 参数,简洁显示全部文件,包括名目下的子名目,及节点号*/ void display_RU_IL(struct stat* stalist,char (*namelist)LENGTH,int n,int mode) int i,count; char pathLENGTH=0,tempLENGTH=0; struct stat staMAX_FILE_COUNT; char nameMAX_FILE_COUNTLENGTH; puts(get_current_dir_name(); display_IL(stalist,namelist,n); putchar(n); strcpy(path,get_current_dir_name(); for(i=0;in;i+) if(strcmp(namelisti,.)=0 | strcmp(namelist
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《计算机公共基础》课件
- 2025年度南京办公室装修项目造价咨询合同3篇
- 2025年度燃气行业员工离职经济补偿及争议处理合同-@-1
- 课题申报参考:逆向跨国并购后企业内部控制合规管理模式构建研究
- 二零二五年度国际能源资源合作合同4篇
- 课题申报参考:面向社交网络大数据的沂蒙精神传播态势及优化路径研究
- 2025版精密机床购置及售后服务合同2篇
- 二零二五年度医疗健康商标转让与知识产权合同
- 2025年度个人与公司间技术秘密保护协议
- 2025版内衣品牌跨界合作营销合同4篇
- 如何提高售后服务的快速响应能力
- 北师大版 2024-2025学年四年级数学上册典型例题系列第三单元:行程问题“拓展型”专项练习(原卷版+解析)
- 2023年译林版英语五年级下册Units-1-2单元测试卷-含答案
- Unit-3-Reading-and-thinking课文详解课件-高中英语人教版必修第二册
- 施工管理中的文档管理方法与要求
- DL∕T 547-2020 电力系统光纤通信运行管理规程
- 种子轮投资协议
- 员工工资条模板
- 执行依据主文范文(通用4篇)
- 浙教版七年级数学下册全册课件
- 华为携手深圳国际会展中心创建世界一流展馆
评论
0/150
提交评论