📄 hls.c
字号:
//实现功能 1. ls 2. ls -l 3. ls -l [若干目录或文件名] 4. ls [若干目录或文件名]#include <stdio.h>#include <sys/types.h>#include <dirent.h>#include <sys/stat.h>#include<pwd.h>#include <grp.h>void ls_output(char dirname[],int flag);void file_permission(int mode,char str[]);char *uid_to_name(uid_t uid);char *gid_to_name(gid_t gid);void show_info(char *filename,struct stat *ptr);void do_stat(char *filename,int flag);void c_show_info(char *filename);char *robchar(char *filename);void c_rob_show_info(char *filename);char file_type(struct stat buf);char *count_file_name(char *filename,int count);main(int argc,char *argv[]){ char cwd[1024]; getcwd(cwd,1024); int flag; char temp; if(argc==1) /* ls */ { flag=0; ls_output(cwd,flag); printf("\n"); //printf("0 none -l output\n"); } else if (argc==2 && (temp=getopt(argc,argv,"l"))!=-1) /* ls -l */ { switch(temp) case 'l': { flag=1; ls_output(cwd,flag); printf("\n"); //printf("1 -l output\n"); } } else if (argc>2 && (temp=getopt(argc,argv,"l"))!=-1) /* ls -l [若干目录或文件名]*/ { flag=2; --argc; ++argv; while(--argc) { ++argv; printf("%s:\n",*argv); ls_output(*argv,flag); printf("\n"); } printf("\n"); //printf("2 -l output\n"); } else /* ls [若干目录或文件名]*/ { flag=3; while(--argc) { ++argv; printf("%s:\n",*argv); ls_output(*argv,flag); printf("\n"); } printf("\n"); //printf("3 non-l output\n"); } }void ls_output(char dirname[],int flag){ //printf("filename:%s",dirname); DIR *dir; struct dirent *p_dirent; char tempname[1000]; struct stat buf; if(lstat(dirname,&buf)==-1) perror(dirname); else { //if (file_type(buf)!='d') do_stat(dirname,flag); if (file_type(buf)=='-') do_stat(dirname,flag); else if (file_type(buf)!='-' && (dir=opendir(dirname))==NULL) fprintf(stderr,"hls: %s: No such file or directory \n",dirname); else { while((p_dirent=readdir(dir))!=NULL) { if(p_dirent->d_name[0]=='.') continue; switch (flag) { case 0: case 1: do_stat(p_dirent->d_name,flag); break; case 2: case 3: strcpy(tempname,dirname); strcat(tempname,"/"); strcat(tempname,p_dirent->d_name); //printf("%s\n",tempname); do_stat(tempname,flag); break; } } closedir(dir); } }}/* 文件类型和权限 */void file_permission(int mode,char str[]){ strcpy(str,"----------"); if(S_ISREG(mode)) str[0]='-'; if(S_ISDIR(mode)) str[0]='d'; if(S_ISCHR(mode)) str[0]='c'; if(S_ISBLK(mode)) str[0]='b'; if( S_ISLNK(mode) ) str[0] = 'l'; 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 *ptr; ptr=getpwuid(uid); return ptr->pw_name;}char *gid_to_name(gid_t gid){ struct group *ptr; ptr=getgrgid(gid); return ptr->gr_name;}void l_show_info(char *filename,struct stat *ptr){ char modestr[11]; file_permission(ptr->st_mode,modestr); printf("%s",modestr); printf("%4d ",(int)ptr->st_nlink); printf("%-8s ",uid_to_name(ptr->st_uid)); printf("%-8s ",gid_to_name(ptr->st_gid)); printf("%8ld ",(long)ptr->st_size); printf("%.12s ",4+ctime(&ptr->st_mtime)); printf("%s\n",filename);}/* 删除字符串中的'/' */char *robchar(char *filename){ char *p=filename; while(*p!='/' && *p!='\0') p++; if (*p=='/') return p+1; else return filename;}void c_show_info(char *filename){ char *tmp; tmp=robchar(filename); printf("%s ",tmp );}void c_rob_show_info(char *filename){ printf("%s\n",filename);}void do_stat(char *filename,int flag){ struct stat buf; char ftype; int rl;// char lname[128]; char *truelname;// char *p=NULL,*q=NULL; if(lstat(filename,&buf)==-1) perror(filename); else { ftype=file_type(buf); switch (flag) { case 0: c_rob_show_info(filename);break; case 3: c_show_info(filename);break; case 1: l_show_info(filename,&buf);break; case 2: if (ftype=='l') { rl=readlink(filename,lname,128); //readlink(filename,lname,128); truelname=count_file_name(lname,rl); p=robchar(filename); strcat(p,"->"); strcat(p,truelname); //strcat(p,lname); l_show_info(p,&buf);break; } else { p=robchar(filename); l_show_info(p,&buf);break; } } }}/*文件类型*/char file_type(struct stat buf){ char ftype; if( S_ISREG(buf.st_mode) ) ftype = '-'; if( S_ISDIR(buf.st_mode) ) ftype = 'd'; //if(S_ISCHR(buf.st_mode)) ftype='c'; if( S_ISLNK(buf.st_mode) ) ftype = 'l'; return ftype;}/* 截取readlink函数返回字符串中的有效部分 */char *count_file_name(char *filename,int count){ char *p=filename; char *q=filename; int i=0; while(i++<count) p++; *p='\0'; return q;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -