do_ls2.c

来自「实现UNIX下的ls全部功能,同时添加了可以生成目录树.实现内容:1.如何读取目」· C语言 代码 · 共 141 行

C
141
字号
#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;  }}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");}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 + -
显示快捷键?