- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Unix 编程环境实验ls功能的C语言实现班级:号:姓名:schnee日期:2012-04-24实验目的练习vi,使用UNIX的系统调用和库函数,体会UNIX文件通配符的处理方式以及命令对选项的处理方式。实验要求编程实现程序list.c,列表普通磁盘文件(不考虑目录和设备文件等),列出文件名和文件大小。与ls命令类似,命令行参数可以有0到多个0个参数:列出当前目录下所有文件参数为普通文件:列出文件参数为目录:列出目录下所有文件实现自定义选项r,a,l,h,m以及--r 递归方式列出子目录a 列出文件名第一个字符为圆点的普通文件(默认情况下不列出文件名首字符为圆点的文件,即只显示隐藏文件)l 后跟一整数,限定文件大小的最小值(字节)h 后跟一整数,限定文件大小的最大值(字节)m 后跟一整数n,限定文件的最近修改时间必须在n天内-- 显式地终止命令选项分析实验代码#includestring#includevector#includestdio.h#includestdlib.h#includedirent.h#includestring.h#includesys/stat.h#includesys/types.husing namespace std;int num, lnum, hnum, mnum;vectorstringfi, fcom, fdir; //files, common files, directorybool rflag, aflag, end;int check_digit(char* str) //判断该字符串是否是整数,返回长度{int num=0, len=strlen(str);for(int i=0; ilen; i++){if(!isdigit(str[i]))break;num++;}return num;}bool checkmodtime(time_t st_mtime)//检查最近修改时间是否符合要求{time_t nowtime;time(nowtime);return nowtime-st_mtime mnum*86400;}void search(const char* path) //输出目录的结果及递归,是主要处理结果的部分{vectorstring list;DIR* dir=opendir(path); //打开目录,得到句柄struct dirent* entry;struct stat st;if(dir==NULL) return; //获取失败printf(%s:\n, path);while((entry=readdir(dir))!=NULL)//返回NULL标志目录表已经读到尾{ //readdir获取一个目录项,返回值指针指向的结论体记录i节点号和文件名string next=(string)path, tp=(string)(entry-d_name);if(next[next.length()-1]!=/) next+=/;next+=(string)(entry-d_name);stat(next.data(), st);if(S_ISDIR(st.st_mode) strcmp(entry-d_name, .) strcmp(entry-d_name, ..) (aflag || tp[0]!=.) ((mnum!=-1 checkmodtime(st.st_mtime))||(mnum==-1)))list.push_back(next);if(check_digit(st, tp))printf(%s\t, entry-d_name);}coutendlendl;for(int i=0; rflag ilist.size(); i++) search(list[i].data());}int main(int argc, char ** argv){lnum = hnum = mnum = -1;rflag = aflag = end = false;//处理输入的命令行for(int i=1; iargc; i++){if(end) //end of analysis{fi.push_back((string)argv[i]);continue;}else{int len=strlen(arg[i]);if(argv[i][0]==-){if(argv[i][1]==-){if(len!=2) {printf(No Such Command !\n);return 1;}end=true;//--显式终止命令选项分析}else if(argv[i][1]==r || argv[i][1]==a){
文档评论(0)