天天看點

一起talk C栗子吧(第七十五回:C語言執行個體--DIY ls指令)

各位看官們,大家好,上一回中咱們說的是DIY cd指令的例子,這一回咱們說的例子是:DIY ls指令。閑話休提,言歸正轉。讓我們一起talk C栗子吧!

看官們,在Linux系統中,終端提供的ls指令是我們最常用的指令之一,相信大家對它一定很熟悉了。今天,讓我們一起來DIY ls指令吧.

下面是具體的操作步驟:

  • 1.使用getcwd函數擷取目前工作路徑;
  • 2.使用opendir函數打開目前的目錄;
  • 3.使用readdir函數讀取目前目錄中的内容,并且儲存到一個數組中;
  • 4.重複步驟3,直到目前目錄中所有的内容都被讀取為止;
  • 5.使用closedir函數關閉目前的目錄;
  • 6.對數組中存放的内容進行排序,使其符合字典順序;
  • 7.依據ls指令的格式顯示數組中的内容;

下面是我們DIY的代碼,請大家參考:

int print(char *str)
{
    char path[PATH_SIZE];
    char name[PATH_SIZE][PATH_SIZE];
    char *p;
    DIR * dir;
    struct dirent *dir_info;
    int i =;

    memset(path,'\0',PATH_SIZE*sizeof(char) );
    memset(name,'\0',PATH_SIZE*sizeof(char) );

    if(NULL == (p=getcwd(path,PATH_SIZE)) )  // 擷取目前目錄的路徑
    {
        printf("can't get the current directory \n");
        return ;
    }

    if(NULL == (dir=opendir(path)) )        //打開目前目錄
    {
        printf("can't open the directory %s \n",path);
        return ;
    }


    while(NULL != (dir_info=readdir(dir)) ) //反複讀取目前目錄中的内容
        strcpy(name[i++],dir_info->d_name);

    closedir(dir);                         //關閉目前目錄

    sort_name(name,i);                     //給目前目錄中的内容排序

    // for ls command
    if( !strcmp(str,".") )                //根據指令的格式顯示目錄中的内容
    {
        i -= ; // can't show . and ..in result
        while(--i>=)
            printf("%s \n",name[i]);
    }

    // for ls -a command
    if( !strcmp(str,"a") )
    {
        printf("for ls -a cmd \n");
        while(--i>=)
            printf("%s \n",name[i]);

            //printf("%d :%s \n",i,name[i]);
    }

    return ;
}
           

通過檢視上面的代碼,大家可以發現我們DIY的指令隻支援”ls”和”ls -a“這兩種指令格式,ls中其它的參數目前還不支援,以後可以再加上,以便進一步完善DIY的ls指令。

上面代碼中,沒有給出排序函數:sort_name的代碼,大家可以從我的資源中下載下傳。該函數使用了冒泡排序算法。大家也可以使用其它的排序算法來實作該排序函數。

上面的代碼中,大量使用了字元串相關的函數,如果有哪位看官忘記了字元串相關的函數,可以檢視我們前面章回中的内容。這裡就不再對字元串操作函數一一進行介紹了。

看官們,正文中就不寫代碼了,上面是核心的代碼,關于排序和其它的代碼沒有列出來。我把所有的代碼整理成了一個檔案,并且放到了我的資源中,大家可以點選這裡下載下傳使用。此外,該函數需要與前面章回中的main.c和main.h一起配合使用。

下面是程式的運作結果,請大家參考:

|->pwd                  //首先使用pwd指令來顯示目前路徑
/home/talk8/Shell       //顯示目前路徑
|->ls                   //輸入ls指令,可以檢視目前目錄中的内容
cd.c 
date.c 
ls.c 
main.c 
main.h 
pwd.c 
s 
|->ls -a               //輸入ls -a指令,可以檢視目前目錄中的内容
.                      //與ls指令相比,ls -a指令多顯示了.和..兩個隐藏内容
.. 
cd.c 
date.c 
ls.c 
main.c 
main.h 
pwd.c 
s 
|->ls -al            //輸入ls -al指令,提示不支援該指令
can't support ls -al command ,please check again 
|->exit              //輸入exit指令,退出shell
           

在顯示目錄中的内容時,我們為了顯示清楚,一個目錄占用一行的内容,這點和系統的ls指令不一樣。系統提供的ls指令,以空格為間隔進行顯示。雖然顯示的形式不同,但是顯示的内容是相同的。

下面是系統ls指令的進行結果:

$ ls
cd.c  date.c  ls.c  main.c  main.h  pwd.c 
ls -a
.  ..  cd.c  date.c  ls.c  main.c  main.h  pwd.c  s
           

各位看官,關于DIY ls指令的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解。

繼續閱讀