亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

linux c模擬ls命令詳解

2020-01-26 16:00:57
字體:
來源:轉載
供稿:網友
復制代碼 代碼如下:

/*
 模擬ls命令,實現參數-tariRl.有些代碼重復出現,可改進
 可以在該程序的基礎上增加參數,該程序思路清晰,容易擴展
 */
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/stat.h>
#include<dirent.h>
#include<sys/ioctl.h>
#include<pwd.h>
#include<grp.h>
#define LL (1<<0)  /*帶l參數標志*/
#define IL (1<<1)  /*帶i參數標志*/
#define RU (1<<2)  /*帶R參數標志*/
#define TL (1<<16) /*帶t參數標志*/
#define AL (1<<17) /*帶a參數標志*/
#define RL (1<<18) /*帶r參數標志*/
#define LENGTH 500 /*字符串最大長度*/
#define MAX_FILE_COUNT 500/*文件列表最大長度*/
/*函數聲明*/
void error(char* error_message,int line);
void display(struct stat* stalist,char (*namelist)[LENGTH],int n,int mode);
int file_list(char* path,struct stat* stalist,char (*namelist)[LENGTH],int mode);
void display_simply(char (*namelist)[LENGTH],int n);
void display_LL(struct stat * stalist,char (*namelist)[LENGTH],int n);
void display_IL(struct stat * stalist,char (*namelist)[LENGTH],int n);
void display_LL_IL(struct stat * stalist,char (*namelist)[LENGTH],int n);
void display_RU(struct stat* stalist,char (*namelist)[LENGTH],int n,int mode);
void display_RU_LL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode);
void display_RU_IL(struct stat* stalist,char (*namelist)[LENGTH],int n,int mode);
void display_RU_IL_LL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode);
/*主函數*/
int main(int argc,char **argv)
{
    int i,j;
    /*mode的前16個位用來標志那些能影響顯示的參數,16位之后的位用來標志不影響輸出格式的參數。這個程序只用到了0-3位,16-18位,如果要在該程序的基礎上增加參數,可以用其他沒有使用的位。
    mode的第0位為1表示帶l參數,mode的第1位為1表示帶i參數,mode的第2位為1表示帶R參數,mode的第16位為1表示帶t參數,mode的第17位為1表示帶a參數,mode的第18位為1表示帶r參數*/
    int mode=0;
    char error_message[LENGTH]={0};/*錯誤信息*/
    char path[LENGTH]={0};/*路徑*/
    struct stat stalist[MAX_FILE_COUNT];/*文件詳細信息數組*/
    char  namelist[MAX_FILE_COUNT][LENGTH];/*文件名數組*/
    int flag=0;/*判斷是否指定了目錄*/
    int count;/*文件個數*/
    /*解析參數*/
    for(i=1;i<argc;i++){
        if(argv[i][0]=='-'){/*如果是選項參數*/
     for(j=1;j<strlen(argv[i]);j++){
  if(argv[i][j]=='l')
      mode=mode|LL;
  else if(argv[i][j]=='i')
      mode=mode|IL;
  else if(argv[i][j]=='R')
      mode=mode|RU;
  else if(argv[i][j]=='r')
      mode=mode|RL;
  else if(argv[i][j]=='a')
      mode=mode|AL;
  else if(argv[i][j]=='t')
      mode=mode|TL;
  else{
      snprintf(error_message,LENGTH,"no option of %c",argv[i][j]);
      error(error_message,__LINE__);
  }     
     }
 }else{/*參數為目錄或文件*/
     if(flag==1)
  error("can not specify more then two dir or file",__LINE__);
     else
  flag=1;
            if(argv[i][0]!='/'){/*相對路徑*/
  strcat(path,get_current_dir_name());
  strcat(path,"/");
  strncat(path,argv[i],strlen(argv[i]));
     }else/*絕對路徑*/
  strcpy(path,argv[i]);
 }
    }
    if(flag==0)/*未指定任何目錄或文件,則使用默認當前目錄*/
 strcat(path,get_current_dir_name());
    /*根據mode獲取指定目錄下的文件*/
    count=file_list(path,stalist,namelist,mode);

    /*根據mode顯示文件*/
    display(stalist,namelist,count,mode);
    return 0;
}
/*獲取文件列表*/
int file_list(char* path,struct stat* stalist,char (*namelist)[LENGTH],int mode)
{
    int i=0,index,j,k;
    DIR *dir;
    struct dirent *ptr;
    char str[LENGTH];
    char nametemp[LENGTH];
    struct stat statemp;
    if(stat(path,&stalist[0])<0){
// puts(path);
 error("the specify file is not exist",__LINE__);
    }
    if(S_ISDIR(stalist[0].st_mode)){/*如果該路徑指向的是一個目錄*/
        if((dir=opendir(path))==NULL){/*打開目錄*/
     sprintf(str,"can not open %s",path);
     error(str,__LINE__);
 }
        chdir(path);/*改變當前工作目錄到path*/
        i=0;
 while((ptr=readdir(dir))!=NULL){/*依次讀取目錄下的所有文件*/
     if(ptr->d_name[0]=='.' && !(mode & AL))/*忽略隱藏文件*/
  continue;
     /*按字母順序插入到stalist數組及namelist數組*/
     for(j=i;j>0;j--){
  if(strcmp(ptr->d_name,namelist[j-1])>0)
      break;
     }
     for(k=i;k>j;k--){
  strcpy(namelist[k],namelist[k-1]);
  stalist[k]=stalist[k-1];
     }
            strcpy(namelist[j],ptr->d_name);
            stat(ptr->d_name,&stalist[j]);
     i++;
     if(i==MAX_FILE_COUNT)
  error("file count beyond MAX_FILE_COUNT",__LINE__);
 }
 closedir(dir);
    }else{
 j=strlen(path)-1;
 while(j>=0 && path[j]!='/'){
     j--;
 }
 if(j<0)
     error("path error",__LINE__);
 j++;
 k=0;
        while(path[j]){
     namelist[0][k]=path[j];
            j++;
      k++;
 }
        namelist[0][k]=0;
        return 1;
    }
    if(mode & TL){/*按文件修改時間排序*/
 for(j=0;j<i;j++){
     index=j;
     for(k=j+1;k<i;k++)
  if(stalist[index].st_mtime<stalist[k].st_mtime){
      index=k;
  }
     statemp=stalist[j];
     stalist[j]=stalist[index];
     stalist[index]=statemp;
     strcpy(nametemp,namelist[j]);
     strcpy(namelist[j],namelist[index]);
     strcpy(namelist[index],nametemp);
 }
    }
    if(mode & RL){/*反序排列*/
 for(j=0;j<i/2;j++){
     strcpy(nametemp,namelist[j]);
     strcpy(namelist[j],namelist[i-j-1]);
     strcpy(namelist[i-j-1],nametemp);
     statemp=stalist[j];
     stalist[j]=stalist[i-j-1];
     stalist[i-j-1]=statemp;
 }
    }
    return i;
}
/*根據mode選擇不同的函數進行顯示*/
void display(struct stat* stalist,char (*namelist)[LENGTH],int n,int mode)
{
    /*使mode的高16位為0*/
    int m = mode & ((1<<16)-1);
    switch(m){
 case 0:
     display_simply(namelist,n);
     break;
 case 1:
     display_LL(stalist,namelist,n);
     break;
 case 2:
     display_IL(stalist,namelist,n);
     break;
 case 3:
     display_LL_IL(stalist,namelist,n);
     break;
 case 4:
     display_RU(stalist,namelist,n,mode);
     break;
 case 5:
     display_RU_LL(stalist,namelist,n,mode);
     break;
        case 6:
     display_RU_IL(stalist,namelist,n,mode);
     break;
 case 7:
     display_RU_IL_LL(stalist,namelist,n,mode);
     break;
    }
}
/*不帶顯示選項,簡單顯示文件名*/
void display_simply(char (*namelist)[LENGTH],int n)
{
    int i,maxlength=0,cols;
    struct winsize ts;
    for(i=0;i<n;i++)
 if(strlen(namelist[i])>maxlength)
     maxlength=strlen(namelist[i]);
    /*獲取終端的大小*/
    ioctl(STDIN_FILENO,TIOCGWINSZ,&ts);
    cols=ts.ws_col;
    cols/=(maxlength+1);
    //lines=ts.ws_row;
    for(i=0;i<n;i++){
       if(i!=0 && i%cols==0)
    puts("");
       printf("%*s",-(maxlength+1),namelist[i]);
    }
    putchar('/n');
}
/*-l 參數,顯示詳細文件信息*/
void display_LL(struct stat * stalist,char (*namelist)[LENGTH],int n)
{
    int i,mode;
    char* str;
    for(i=0;i<n;i++){
        mode=stalist[i].st_mode;
        if(S_ISDIR(mode))
     printf("d");
 else
     printf("-");
 if(mode & (1<<8))
     printf("r");
 else
     printf("-");
        if(mode & (1<<7))
     printf("w");
 else
     printf("-");
        if(mode & (1<<6))
     printf("x");
 else
     printf("-");
        if(mode & (1<<5))
     printf("r");
 else
     printf("-");
        if(mode & (1<<4))
     printf("w");
 else
     printf("-");
        if(mode & (1<<3))
     printf("x");
 else
     printf("-");
        if(mode & (1<<2))
     printf("r");
 else
     printf("-");
        if(mode & (1<<1))
     printf("w");
 else
     printf("-");
        if(mode & (1<<0))
     printf("x");
 else
     printf("-");
 printf(" %-3d",stalist[i].st_nlink);
 printf(" %-6s",getpwuid(stalist[i].st_uid)->pw_name);
 printf(" %-6s",getgrgid(stalist[i].st_gid)->gr_name);
 printf(" %-10d",stalist[i].st_size);
 str=ctime(&stalist[i].st_mtime);
 str[strlen(str)-2]=0;
 printf(" %s",str);
 printf(" %s/n",namelist[i]);
    }
}
/*-i 參數,顯示文件名及節點號*/
void display_IL(struct stat* stalist,char (*namelist)[LENGTH],int n)
{
    int i,maxlength=0,cols;
    struct winsize ts;
    for(i=0;i<n;i++)
 if(strlen(namelist[i])>maxlength)
     maxlength=strlen(namelist[i]);
    /*獲取終端的大小*/
    ioctl(STDIN_FILENO,TIOCGWINSZ,&ts);
    cols=ts.ws_col;
    cols/=(maxlength+9);
    //lines=ts.ws_row;

    for(i=0;i<n;i++){
       if(i!=0 && i%cols==0)
    puts("");
       printf("%-8d ",stalist[i].st_ino);
       printf("%*s",-(maxlength+1),namelist[i]);
    }
    putchar('/n');  
}
/*-li 參數,顯示詳細文件信息和節點號*/
void display_LL_IL(struct stat * stalist,char (*namelist)[LENGTH],int n)
{
    int i,mode;
    char* str;
    for(i=0;i<n;i++){
        printf("%-8d ",stalist[i].st_ino);
        mode=stalist[i].st_mode;
        if(S_ISDIR(mode))
     printf("d");
 else
     printf("-");
 if(mode & (1<<8))
     printf("r");
 else
     printf("-");
        if(mode & (1<<7))
     printf("w");
 else
     printf("-");
        if(mode & (1<<6))
     printf("x");
 else
     printf("-");
        if(mode & (1<<5))
     printf("r");
 else
     printf("-");
        if(mode & (1<<4))
     printf("w");
 else
     printf("-");
        if(mode & (1<<3))
     printf("x");
 else
     printf("-");
        if(mode & (1<<2))
     printf("r");
 else
     printf("-");
        if(mode & (1<<1))
     printf("w");
 else
     printf("-");
        if(mode & (1<<0))
     printf("x");
 else
     printf("-");
 printf(" %-3d",stalist[i].st_nlink);
 printf(" %-6s",getpwuid(stalist[i].st_uid)->pw_name);
 printf(" %-6s",getgrgid(stalist[i].st_gid)->gr_name);
 printf(" %-10d",stalist[i].st_size);
 str=ctime(&stalist[i].st_mtime);
 str[strlen(str)-2]=0;
 printf(" %s",str);
 printf(" %s/n",namelist[i]);

    }
}
/*-R 參數,簡單顯示所有文件,包括目錄下面的子目錄*/
void display_RU(struct stat* stalist,char (*namelist)[LENGTH],int n,int mode)
{
    int i,count;
    char path[LENGTH]={0},temp[LENGTH]={0};
    struct stat sta[MAX_FILE_COUNT];
    char name[MAX_FILE_COUNT][LENGTH];
    puts(get_current_dir_name());
    display_simply(namelist,n);
    putchar('/n');
    strcpy(path,get_current_dir_name());

    for(i=0;i<n;i++){
        if(strcmp(namelist[i],".")==0 || strcmp(namelist[i],"..")==0)
          continue;
 if(S_ISDIR(stalist[i].st_mode)){
     strcpy(temp,path);
     strcat(path,"/");
     strcat(path,namelist[i]);
     count=file_list(path,sta,name,mode);
     display_RU(sta,name,count,mode);
            strcpy(path,temp);
 }
    }
}
/*-Rl 參數,顯示所有文件,包括目錄下面的子目錄的詳細信息*/
void display_RU_LL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode)
{
    int i,count;
    char path[LENGTH]={0},temp[LENGTH]={0};
    struct stat sta[MAX_FILE_COUNT];
    char name[MAX_FILE_COUNT][LENGTH];
    puts(get_current_dir_name());
    display_LL(stalist,namelist,n);
    putchar('/n');
    strcpy(path,get_current_dir_name());

    for(i=0;i<n;i++){
 if(strcmp(namelist[i],".")==0 || strcmp(namelist[i],"..")==0)
          continue;
 if(S_ISDIR(stalist[i].st_mode)){
     strcpy(temp,path);
     strcat(path,"/");
     strcat(path,namelist[i]);
     count=file_list(path,sta,name,mode);
     display_RU_LL(sta,name,count,mode);
     strcpy(path,temp);
 }
    }
}
/*-Ri 參數,簡單顯示所有文件,包括目錄下的子目錄,及節點號*/
void display_RU_IL(struct stat* stalist,char (*namelist)[LENGTH],int n,int mode)
{
    int i,count;
    char path[LENGTH]={0},temp[LENGTH]={0};
    struct stat sta[MAX_FILE_COUNT];
    char name[MAX_FILE_COUNT][LENGTH];
    puts(get_current_dir_name());
    display_IL(stalist,namelist,n);
    putchar('/n');
    strcpy(path,get_current_dir_name());

    for(i=0;i<n;i++){
 if(strcmp(namelist[i],".")==0 || strcmp(namelist[i],"..")==0)
          continue;
 if(S_ISDIR(stalist[i].st_mode)){
     strcpy(temp,path);
     strcat(path,"/");
     strcat(path,namelist[i]);
     count=file_list(path,sta,name,mode);
     display_RU_IL(sta,name,count,mode);
     strcpy(path,temp);
 }
    }
}
/*-Ril 參數,顯示所有文件,包括目錄下面的子目錄的詳細信息,及節點號*/
void display_RU_IL_LL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode)
{
    int i,count;
    char path[LENGTH]={0},temp[LENGTH]={0};
    struct stat sta[MAX_FILE_COUNT];
    char name[MAX_FILE_COUNT][LENGTH];
    puts(get_current_dir_name());
    display_LL_IL(stalist,namelist,n);
    putchar('/n');
    strcpy(path,get_current_dir_name());

    for(i=0;i<n;i++){
 if(strcmp(namelist[i],".")==0 || strcmp(namelist[i],"..")==0)
          continue;
 if(S_ISDIR(stalist[i].st_mode)){
     strcpy(temp,path);
     strcat(path,"/");
     strcat(path,namelist[i]);
     count=file_list(path,sta,name,mode);
     display_RU_IL_LL(sta,name,count,mode);
     strcpy(path,temp);
 }
    }
}
//錯誤處理函數
void error(char* error_message,int line)
{
    char str[5];
    sprintf(str,"%d:",line);
    strcat(str,error_message);
    perror(str);
    exit(EXIT_FAILURE);
}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久6精品影院| 欧美疯狂xxxx大交乱88av| 国产91色在线|| 日韩欧美aaa| 欧美久久久精品| 中文字幕一区二区精品| 欧美视频中文在线看| 亚洲国产精品成人va在线观看| 国产专区精品视频| 精品国产福利视频| 欧美精品videofree1080p| 欧美性高跟鞋xxxxhd| 精品日韩视频在线观看| 欧美天天综合色影久久精品| 国产精品主播视频| 亚洲性69xxxbbb| 美女999久久久精品视频| 欧美日韩精品在线观看| 爽爽爽爽爽爽爽成人免费观看| 日韩专区在线观看| 亚洲免费一级电影| 亚洲电影免费观看| 中文字幕在线看视频国产欧美在线看完整| 欧美视频二区36p| 第一福利永久视频精品| 欧美在线一级视频| 日本aⅴ大伊香蕉精品视频| 国产脚交av在线一区二区| 欧美午夜精品久久久久久久| 91中文在线观看| 欧美亚洲另类激情另类| 永久555www成人免费| 最好看的2019年中文视频| 成人春色激情网| 亚洲а∨天堂久久精品喷水| 中文字幕亚洲一区二区三区| 91精品国产精品| 欧美视频免费在线观看| 九九九热精品免费视频观看网站| 最近日韩中文字幕中文| 亚洲成人教育av| 久久理论片午夜琪琪电影网| 欧美裸身视频免费观看| 在线视频国产日韩| 日本国产精品视频| 另类天堂视频在线观看| 日韩在线播放av| 亚洲japanese制服美女| 欧美激情亚洲国产| 成人免费视频97| 国产日韩欧美日韩| 久久久国产影院| 亚洲三级av在线| 欧美国产高跟鞋裸体秀xxxhd| 日韩a**站在线观看| 国产精品最新在线观看| 性欧美xxxx视频在线观看| 欧美激情中文字幕乱码免费| 欧美高跟鞋交xxxxxhd| 欧美专区国产专区| 久久91亚洲精品中文字幕| 国产精品吊钟奶在线| 国产精品小说在线| 91免费国产视频| 日韩欧美中文字幕在线播放| 欧美疯狂xxxx大交乱88av| 尤物yw午夜国产精品视频| 亚洲国产精品成人va在线观看| 亚洲精品久久7777777| 亚洲欧美中文字幕在线一区| 亚洲一区久久久| 国产精品一区二区3区| 亚洲精品久久久一区二区三区| 精品国产一区二区三区久久狼黑人| 美女av一区二区三区| 亚洲一区二区精品| 午夜精品99久久免费| 日韩av在线直播| 色偷偷9999www| 久久久久久噜噜噜久久久精品| 北条麻妃99精品青青久久| 国产精品久久久久久av福利软件| 日韩在线观看成人| 97精品国产97久久久久久| 亚洲第一免费播放区| 麻豆精品精华液| 亚洲国产精品女人久久久| 欧美色播在线播放| 欧美重口另类videos人妖| 97在线免费观看| 久久久亚洲成人| 久久久精品国产一区二区| 久久亚洲国产精品| 久久中文字幕国产| 97久久精品视频| 日韩一级裸体免费视频| 亚洲国产欧美一区二区三区同亚洲| 国产91成人video| 精品久久久精品| 国产精品爽黄69| 高清在线视频日韩欧美| 一区二区在线免费视频| 91精品久久久久| 亚洲成人av在线| 国产精品揄拍一区二区| 92看片淫黄大片欧美看国产片| 中文字幕亚洲欧美日韩高清| 欧美丰满老妇厨房牲生活| 久久亚洲精品成人| 最近2019中文免费高清视频观看www99| 国产大片精品免费永久看nba| 亚洲在线一区二区| 97久久精品人人澡人人爽缅北| 成人免费网站在线| 国产精品日韩一区| 亚洲精品欧美一区二区三区| 欧美丝袜一区二区| 国产美女久久精品香蕉69| 亚洲精品中文字幕有码专区| 国产精品视频播放| 国产一区二区三区视频| 91亚洲永久免费精品| 日本精品中文字幕| 国产z一区二区三区| 中文字幕自拍vr一区二区三区| 国产亚洲欧美日韩精品| 欧美精品一本久久男人的天堂| 精品视频久久久久久久| 亚洲天堂网在线观看| 日韩一区二区久久久| 午夜精品蜜臀一区二区三区免费| 国产在线久久久| 91精品视频观看| 久久国产精品影视| 日本一区二区三区在线播放| 97精品久久久中文字幕免费| 国产精品久久久久7777婷婷| 亚洲国产成人精品久久久国产成人一区| 久久久99免费视频| 永久免费看mv网站入口亚洲| 国产精品第七影院| 欧美高清无遮挡| 91久久中文字幕| 97精品视频在线播放| 欧美乱妇高清无乱码| 欧美性视频在线| 久久在线视频在线| 深夜成人在线观看| 国产91精品高潮白浆喷水| 亚洲美女av在线| 亚洲成人激情视频| 国产精品xxx视频| 亚洲女人初尝黑人巨大| 一区二区三区天堂av| 国产美女精品免费电影| 97视频免费看| 久久精品一本久久99精品| 国产精品免费看久久久香蕉| 国产精品黄色av| 国产丝袜一区二区| 91精品视频大全| 亚洲老头同性xxxxx| 国产精品∨欧美精品v日韩精品| 亚洲自拍高清视频网站|