各位看官們,大家好,上一回中咱們說的是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指令的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解。