版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
-7-操作系统实验报告实验名称:实现ls命令实验计算机科学与技术学院目录一、实验目的和要求 2二、实验内容 2三、实验步骤 2四、实验结果与分析 31.输出当前目录下文件 32.输出指定目录下文件 3五、程序源代码 5六、实验体会 7一、实验目的和要求 在linux系统下用C语言编写一个程序实现linux系统下ls命令的功能。二、实验内容 问题:编写一个程序实现linux系统下ls命令的功能。首先通过Linux系统的文件目录流打开函数DIR*opendir(constchar*name);来先打开文件目录,然后通过系统调用函数structdirent*readdir(DIR*dirp);读取文件目录下的文件信息。其中文件结构体dirent的结构如下:structdirent{ino_td_ino;/*inodenumber*/off_td_off;/*offsettothenextdirent*/unsignedshortd_reclen;/*lengthofthisrecord*/unsignedchard_type;/*typeoffile;notsupportedbyallfilesystemtypes*/chard_name[256];/*filename*/};三、实验步骤 根据实验要求,实现指令ls的基本功能,即实现列出当前目录下的文件名,还有就是实现列出指定目录下的所有文件的文件名信息。 在编写好代码之后编译代码然后输入指令测试实验结果是否符合要求。四、实验结果与分析1、输入指令:./myls输入默认的指令,输出当前目录下的文件名称,并用不同颜色区分文件夹和文件的区别。实验结果如下图图1所示:图1输出当前目录下所有的文件名2、输入指令:./myls./Documents给定一个制定的路径,输出所给定路径下所有文件的文件名。结果如下图图2所示:图2输出指定目录下的所有文件名五、程序源代码/**************************FileName:myls.c*Author:*Date:2014/1/5***************************/#include<stdio.h>#include<stdlib.h>#include<dirent.h>#include<errno.h>#include<string.h>#include<sys/ioctl.h>#include<unistd.h>#include<termios.h>#include<sys/stat.h>#defineSPACE4/*自定义的字符串结构体*/typedefstruct{ char*str;/*实际内容*/ unsignedlength;/*字符串长度*/}String;/*文件信息结构体*/typedefstruct{ unsignedlength;/*集合中文件名的数量*/ unsignedi,j;/*i是行数,j是列数*/ String*filenames; unsignedmaxlen;/*文件名集合中最大的文件名长度*/ char**formats;/*格式化输出序列*/}FormatInfo;/*获取无符号整型数十进制数的长度*/unsignedunsigned_length(unsignedn){ unsignedlength=0; do{ ++length; n/=10; }while(n) returnlength;}/*预读根目录,将格式化输出的信息保存在info中*/voidPreread(char*root,FormatInfo*info){ DIR*dir; unsignedi,j,count=0; structdirent*ptr; Stringfilename; unsigned*g=NULL;/*g是根据目录下的目录项名的长度进行分组的辅助变量*/ unsignedwidth=0; unsignedgroup=0; unsignedmax=0; unsignedrow=1; unsignedpos=0; structwinsizet_size; ioctl(STDIN_FILENO,TIOCGWINSZ,&t_size);/*获取终端的行数和列数*/ if(info==NULL){ printf("Error!\"info\"cannotbeNULL!\n"); return; } dir=opendir(root);
if(dir==NULL){ perror("Failtoopendir.\n"); exit(1); } while(readdir(dir))++count;/*统计文件和目录的个数*/ rewinddir(dir);/*回卷读取目录的指针*/ info->filenames=(String*)malloc(sizeof(String)*count); g=(unsigned*)malloc(sizeof(unsigned)*count); i=0;/*获取文件或目录名和计算其长度*/ while((ptr=readdir(dir))!=NULL){ filename.str=ptr->d_name;/*文件或目录名*/ filename.length=strlen(ptr->d_name); info->filenames[i++]=filename; }/*对目录项根据目录名或文件名用选择排序法从小到大进行排序*/ for(i=0;i<count;++i){ for(j=i;j<count;++j){ if(strcmp(info->filenames[i].str, info->filenames[j].str)>0){ filename=info->filenames[i]; info->filenames[i]=info->filenames[j]; info->filenames[j]=filename; } } } /*用试探的方法测试最后列表的组数*/ group=count;/*先假定分为count个列表*/ row=1;/*每列的行数为1*/ do{ for(j=0,width=0;j<group;++j){ for(i=0,max=0;i<row;++i){ /*找出每一列中文件或目录名最长的那一个*/ pos=j*row+i; if(pos>=count)break; if(info->filenames[pos].length>max){ max=info->filenames[pos].length; g[j]=max;/*把每个列表的最大宽度存放到g数组里*/ } } width+=(max+SPACE);/*将各组最长的文件或目录名的长度相加,把列表之间的间隔也算上*/ } /*假如其总宽度大于终端的宽度(列数),则把分组列表的数量减少,继续试探。*/ if(width>=t_size.ws_col){ --group; row=(count%group)?(count/group+1):(count/group); }else{
break;/*否则,估算列表的数量结束*/ } }while(1); info->formats=(char**)malloc(sizeof(char*)*group); info->maxlen=0; for(i=0;i<group;++i){ if(g[i]>info->maxlen) info->maxlen=g[i];/*这里找出最大文件或目录名的长度*/ g[i]+=SPACE;/*把列表之间的间隔算上*/ j=unsigned_length(g[i])+4; info->formats[i]=(char*)malloc(sizeof(char)*j); sprintf(info->formats[i],"%%-%us",g[i]);/*这里就是组织格式化输出字符串的关键部分*/ info->formats[i][j]='\0'; } putchar('\n'); info->length=count; info->i=row;/*列表行数*/ info->j=group;/*列表数量*/ free(g); closedir(dir);}voidMyls(char*root){ FormatInfofi; inti,j,pos,len; char*filepath=NULL; structstatbuf; Preread(root,&fi);/*预读目录*/ len=strlen(root); filepath=(char*)malloc(sizeof(char)*(strlen(root)+fi.maxlen+1)); filepath[0]='\0'; strcat(filepath,root); if(filepath[len-1]!='/'){ filepath[len++]='/'; } for(i=0,pos=0;i<fi.i;++i){ for(j=0;j<fi.j;++j){ pos=j*fi.i+i; if(pos<fi.length){ filepath[len]='\0'; strcat(filepath,fi.filenames[pos].str); stat(filepath,&buf); if(S_ISDIR(buf.st_mode)){
printf("\033[01;36m");//Setcolor_dark-green }else{ printf("\033[0m");//Setdefault_color } printf(fi.formats[j],fi.filenames[pos]); }elseif(i<fi.i){ break; }else{ putchar('\n'); return; } } putchar('\n'); } printf("\033[0m");//Restoredefault_color free(filepath);}intmain(intargc,char*argv[]){ if(argc<1){ printf("参数错误!/n"); exit(1); }elseif(argc==1){ Myls("."); }else{ Myls(argv[1]); } return0;}六、实验体会 这次实验明显感觉到比前两次实验要简单一些,因为这些内
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 课件苏州中世商务策划有限公司苏州中源科达企业管理有限公司
- 《为什么会犯罪》课件
- 2024年中考一轮复习六册书基础知识填空(附答案)10-66-16
- 2024-2025学年福建省泉州市晋江市养正中学九年级(上)第二次月考数学试卷
- 期末模拟试卷02(解析版)
- 《PE投资逻辑》课件
- 《市场策划书》课件
- 四年级下册夜莺的歌声课件
- 《OM系列产品介绍》课件
- 小学六年级科学课件教科版第5课 影长的四季变化
- DB11 2007-2022城镇污水处理厂大气污染物排放标准
- YY/T 1698-2020人类体外辅助生殖技术用医疗器械辅助生殖穿刺取卵针
- GB/T 3274-2007碳素结构钢和低合金结构钢热轧厚钢板和钢带
- 【课件】7.2技术作品(产品)说明书及其编写课件-2021-2022学年高中通用技术苏教版必修《技术与设计1》
- (完整)医院收费员考试题题库及参考答案(通用版)
- 校本研修教研工作总结汇报课件
- 大孔吸附树脂技术课件
- 空白货品签收单
- 建筑电气施工图(1)课件
- 质量管理体系运行奖惩考核办法课案
- 泰康人寿养老社区介绍课件
评论
0/150
提交评论