do_ls2.c~
来自「实现UNIX下的ls全部功能,同时添加了可以生成目录树.实现内容:1.如何读取目」· C~ 代码 · 共 176 行
C~
176 行
#include"globals.h"void do_ls2(const char *dir, const struct flg opt_flg){ int n,i,total; total=0; struct dirent **namelist; if(opt_flg.aflg==3) dostat(dir,opt_flg); else { switch(opt_flg.oflg) { case 0: n=scandir(dir, &namelist, 0, alphasort);break; case 1: n=scandir(dir, &namelist, 0, ctimesort);break; case 2: n=scandir(dir, &namelist, 0, blocksort);break; case 3: n=scandir(dir, &namelist, 0, mtimesort);break; case 4: n=scandir(dir, &namelist, 0, atimesort);break; case 5: n=scandir(dir, &namelist, 0, revalpsort);break; } if(n<0) perror(dir); else { if(opt_flg.aflg==0){ for(i=0; i<n; i++){ if(namelist[i]->d_name[0]!='.') //不显示'.', '..'和以'.'开头的文件 total+=dostat(namelist[i]->d_name,opt_flg); free(namelist[i]); } } else if(opt_flg.aflg==1) { for(i=0;i<n;i++){ total+=dostat(namelist[i]->d_name, opt_flg); free(namelist[i]); } } else if(opt_flg.aflg==2) { for(i=0;i<n;i++){ if(strcmp(namelist[i]->d_name, ".")!=0&&strcmp(namelist[i]->d_name, "..")!=0) total+=dostat(namelist[i]->d_name, opt_flg); free(namelist[i]); } } free(namelist); printf("total %d\n",total); } }}int dostat(const char *filename, const struct flg opt_flg){ struct stat info; int blocks; if(stat(filename, &info)==-1) perror(filename); else { if(S_ISDIR(info.st_mode)) blocks=4; else blocks=getblocks((long)info.st_size); if(opt_flg.sflg==1) printf("%4d ",blocks); show_file_info(filename, &info, opt_flg); return blocks; }}int getblocks(long size){ long blocks; blocks=size/4096; if(size%4096!=0) ++blocks; blocks<<=2; return blocks;}void show_file_info(const char *filename, const struct stat *info, const struct flg opt_flg){ char *uid_to_name(), *ctime(),*gid_to_name(),*filemode(); void mode_to_letters(const int mode, char str[]); char modestr[11]; mode_to_letters(info->st_mode, modestr); if(opt_flg.iflg==1) printf("%8d ",info->st_ino); printf("%s ", modestr); printf("%4d ", (int)info->st_nlink); if(opt_flg.nflg==0) printf("%-8s ", uid_to_name(info->st_uid)); else printf("%-8d ",info->st_uid); if(opt_flg.gflg==0){ if(opt_flg.nflg==0) printf("%-8s ", gid_to_name(info->st_gid)); else printf("%-8d ", info->st_gid); } if(opt_flg.hflg==0) printf("%8ld ", (long)info->st_size); else print_size_kmg((long)info->st_size); if(opt_flg.oflg==1) printf("%.12s ", 4+ctime(&info->st_ctime)); else if(opt_flg.oflg==4) printf("%.12s ", 4+ctime(&info->st_atime)); else printf("%.12s ", 4+ctime(&info->st_mtime)); print_filename(filename, info->st_mode); printf("\n");}void print_size_kmg(const long size){ if(size<1024) printf("%8ld ", size); else if(size<1024*1024) printf("%8.1lfK ", (size/1024.0)); else if(size<1024*1024*1024) printf("%8.1lfM ", (size/1024.0/1024.0)); else printf("%8.1lfG ", (size/1024.0/1024.0/1024.0));}void print_filename(const char *filename, int mode){ if(mode&(S_IXUSR||S_IXGRP||S_IXOTH)) printf("\033[0;32;32m"); //blue switch(mode&(S_IFMT)) { //case S_IFREG: printf(""); break; case S_IFDIR: printf("\033[0;32;34m"); break; //blue //case S_IFBLK: printf(""); break; //case S_IFCHR: printf(""); break; case S_IFIFO: printf("\033[1;33m"); break; //yellow case S_IFLNK: printf("\033[0;36m"); break; //cyan case S_IFSOCK: printf("\033[0;35m"); break; //purple } printf("%s", filename); printf("\033[m");}static char perms[11]="_rwxrwxrwx";void mode_to_letters(const int mode, char str[]){ int i, flg; flg=0400; strcpy(str,"----------"); if(S_ISDIR(mode))str[0]='d'; if(S_ISCHR(mode))str[0]='c'; if(S_ISBLK(mode))str[0]='b'; for(i=1; i<10; i++ ){ if(mode&flg) str[i]=perms[i]; flg>>=1; }}char *uid_to_name(uid_t uid){ struct passwd *getpwuid(), *pw_ptr; static char numstr[10]; if((pw_ptr=getpwuid(uid))==NULL){ sprintf(numstr, "%d", uid); return numstr; } else return pw_ptr->pw_name;}char *gid_to_name(gid_t gid){ struct group *getgrgid(), *grp_ptr; static char numstr[10]; if((grp_ptr=getgrgid(gid))==NULL){ sprintf(numstr, "%d",gid); return numstr; } else return grp_ptr->gr_name;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?