linux模擬ls命令代碼代碼如下:
/*
模擬限位開關(guān)(限位開關(guān))命令,實(shí)現(xiàn)參數(shù)-塔里爾。有些代碼重復(fù)出現(xiàn),可改進(jìn)
(資料圖)
可以在該程序的基礎(chǔ)上增加參數(shù),該程序思路清晰,容易擴(kuò)展
*/
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定義LL (10) /*帶l參數(shù)標(biāo)志*/
#定義白細(xì)胞介素11) /*帶我參數(shù)標(biāo)志*/
#定義RU (12) /*帶稀有參數(shù)標(biāo)志*/
#定義TL (116) /*帶t參數(shù)標(biāo)志*/
#定義鋁(117) /*帶a參數(shù)標(biāo)志*/
#定義RL (118) /*帶r參數(shù)標(biāo)志*/
#定義長(zhǎng)度500 /*字符串最大長(zhǎng)度*/
#定義最大文件計(jì)數(shù)500/*文件列表最大長(zhǎng)度*/
/*函數(shù)聲明*/
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(* name list)[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);
/*主函數(shù)*/
int main(int argc,char **argv)
{
int i,j;
/*模式的前16個(gè)位用來標(biāo)志那些能影響顯示的參數(shù),16位之后的位用來標(biāo)志不影響輸出格式的參數(shù)。這個(gè)程序只用到了0-3位,16-18位,如果要在該程序的基礎(chǔ)上增加參數(shù),可以用其他沒有使用的位。
方式的第0位為一表示帶l參數(shù),模式的第一位為一表示帶我參數(shù),模式的第2位為一表示帶稀有參數(shù),模式的第16位為一表示帶t參數(shù),模式的第17位為一表示帶a參數(shù),模式的第18位為一表示帶r參數(shù)*/
int mode=0;
char error _ message[LENGTH]={ 0 };/*錯(cuò)誤信息*/
char path[LENGTH]={ 0 };/*路徑*/
struct stat stalist[MAX _ FILE _ COUNT];/*文件詳細(xì)信息數(shù)組*/
字符名稱列表[MAX _ FILE _ COUNT][LENGTH];/*文件名數(shù)組*/
int flag=0;/*判斷是否指定了目錄*/
(同Internationalorganizations)國(guó)際組織計(jì)數(shù);/*文件個(gè)數(shù)*/
/*解析參數(shù)*/
for(I=1;我
if(argv[i][0]=="-"){/*如果是選項(xiàng)參數(shù)*/
for(j=1;j
if(argv[i][j]=="l ")
模式=模式| LL
else if(argv[i][j]=="i ")
模式=模式| IL
else if(argv[i][j]=="R ")
模式=模式| RU
else if(argv[i][j]=="r ")
模式=模式| RL
else if(argv[i][j]=="a ")
模式=模式| AL
else if(argv[i][j]=="t ")
模式=模式| TL
否則{
snprintf(error_message,LENGTH," no option of %c ",argv[I][j]);
錯(cuò)誤(錯(cuò)誤消息,__行_ _);
}
}
}else{/*參數(shù)為目錄或文件*/
if(flag==1)
錯(cuò)誤("不能指定兩個(gè)以上的目錄或文件",_ _ LINE _ _);
其他
flag=1;
if(argv[i][0]!="/"){/*相對(duì)路徑*/
strcat(path,get _ current _ dir _ name());
strcat(路徑,"/");
strncat(path,argv[i],strlen(argv[I]);
}else/*絕對(duì)路徑*/
strcpy(path,argv[I]);
}
}
if(flag==0)/*未指定任何目錄或文件,則使用默認(rèn)當(dāng)前目錄*/
strcat(path,get _ current _ dir _ name());
/*根據(jù)方式獲取指定目錄下的文件*/
count=file_list(path,stalist,namelist,mode);
/*根據(jù)方式顯示文件*/
顯示(列表、名稱列表、計(jì)數(shù)、模式);
返回0;
}
/*獲取文件列表*/
int file_list(char* path,struct stat* stalist,char (*namelist)[LENGTH],int mode)
{
int i=0,index,j,k;
目錄*目錄
結(jié)構(gòu)方向* ptr
char str[LENGTH];
char name temp[LENGTH];
結(jié)構(gòu)狀態(tài)狀態(tài)
if(stat(path,stalist[0])0){
//puts(路徑);
錯(cuò)誤("指定文件不存在,_ _ LINE _ _);
}
if(S_ISDIR(stalist[0]).st_mode)){/*如果該路徑指向的是一個(gè)目錄*/
if((dir=opendir(path))==NULL){/*打開目錄*/
sprintf(str,無法打開“%s”,路徑);
error(str,_ _ LINE _ _);
}
chdir(路徑);/*改變當(dāng)前工作目錄到路徑*/
I=0;
while((ptr=readdir(dir))!=NULL){/*依次讀取目錄下的所有文件*/
if(ptr-d_name[0]==" . "?。J絘1))/*忽略隱藏文件*/
繼續(xù);
/*按字母順序插入到跟蹤者數(shù)組及名字表數(shù)組*/
for(j=I;j0;j - ){
if(strcmp(ptr-d_name,namelist[j-1])0)
打破;
}
for(k=I;kj;k - ){
strcpy(名稱列表[k],名稱列表[k-1]);
stalist[k]=stalist[k-1];
}
strcpy(namelist[j],ptr-d _ name);
stat(ptr-d_name,stalist[j]);
我;
if(I==最大文件數(shù))
錯(cuò)誤("文件計(jì)數(shù)超出" MAX_FILE_COUNT ",_ _ LINE _ _);
}
closedir(dir);
}否則{
j=strlen(path)-1;
while(j=0 path[j]!="/"){
j-;
}
如果(j0)
錯(cuò)誤("路徑錯(cuò)誤,_ _ LINE _ _);
j;
k=0;
while(path[j]){
名稱列表[0][k]=路徑[j];
j;
k;
}
名稱列表[0][k]=0;
返回1;
}
如果(模式TL){/*按文件修改時(shí)間排序*/
for(j=0;j
index=j;
for(k=j ^ 1;k
if(stalist[index].圣彼得堡時(shí)間
index=k;
}
statemp=stalist[j];
stalist[j]=stalist[index];
stalist[index]=statemp;
strcpy(nametemp,name list[j]);
strcpy(名稱列表[j],名稱列表[索引]);
strcpy(namelist[index],name temp);
}
}
如果(模式RL){/*反序排列*/
for(j=0;j
strcpy(nametemp,name list[j]);
strcpy(名稱列表[j],名稱列表[I-j-1]);
strcpy(namelist[i-j-1],name temp);
statemp=stalist[j];
stalist[j]=stalist[I-j-1];
stalist[I-j-1]=statemp;
}
}
返回我;
}
/*根據(jù)方式選擇不同的函數(shù)進(jìn)行顯示*/
void display(struct stat* stalist,char (*namelist)[LENGTH],int n,int mode)
{
/*使方式的高16位為0*/
int m=mode((116)-1);
開關(guān)(m){
案例0:
display_simply(namelist,n);
打破;
案例1:
display_LL(stalist,namelist,n);
打破;
案例二:
display_IL(stalist,namelist,n);
打破;
案例三:
display_LL_IL(stalist,namelist,n);
打破;
案例4:
display_RU(stalist,namelist,n,mode);
打破;
案例5:
display_RU_LL(stalist,namelist,n,mode);
打破;
案例6:
display_RU_IL(stalist,namelist,n,mode);
打破;
案例7:
display_RU_IL_LL(stalist,namelist,n,mode);
打破;
}
}
/*不帶顯示選項(xiàng),簡(jiǎn)單顯示文件名*/
void display _ simply(char(* name list)[LENGTH],int n)
{
int i,maxlength=0,cols
結(jié)構(gòu)winsize ts
for(I=0;我
if(strlen(name list[I])maxlength)
maxlength=strlen(name list[I]);
/*獲取終端的大小*/
ioctl(STDIN_FILENO,TIOCGWINSZ,ts);
cols=ts.ws _ col
cols/=(maxlength 1);
//lines=ts。ws _ row
for(I=0;我
如果(我!=0 i%cols==0)
puts(" ");
printf("%*s ",-(maxlength 1),name list[I]);
}
putchar(" \ n ");
}
/*-l參數(shù),顯示詳細(xì)文件信息*/
void display _ LL(struct stat * stalist,char (*namelist)[LENGTH],int n)
{
int i,模式
字符*字符串
for(I=0;我
mode=stalist[i].st模式
if(S_ISDIR(mode))
printf(" d ");
其他
printf("-");
如果(模式(18))
printf(" r ");
其他
printf("-");
如果(模式(17))
printf(" w ");
其他
printf("-");
如果(模式(16))
printf(" x ");
其他
printf("-");
如果(模式(15))
printf(" r ");
其他
printf("-");
如果(模式(14))
printf(" w ");
其他
printf("-");
如果(模式(13))
printf(" x ");
其他
printf("-");
如果(模式(12))
printf(" r ");
其他
printf("-");
如果(模式(11))
printf(" w ");
其他
printf("-");
如果(模式(10))
printf(" x ");
其他
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 ",名稱列表[i]).
}
}
/*-我參數(shù),顯示文件名及節(jié)點(diǎn)號(hào)*/
void display _ IL(struct stat * stalist,char (*namelist)[LENGTH],int n)
{
int i,maxlength=0,cols
結(jié)構(gòu)winsize ts
for(I=0;我
if(strlen(name list[I])maxlength)
maxlength=strlen(name list[I]);
/*獲取終端的大小*/
ioctl(STDIN_FILENO,TIOCGWINSZ,ts);
cols=ts.ws _ col
cols/=(maxlength 9);
//lines=ts。ws _ row
for(I=0;我
如果(我!=0 i%cols==0)
puts(" ");
printf(“%-8d”,stalist[i].ST _ ino);
printf("%*s ",-(maxlength 1),name list[I]);
}
putchar(" \ n ");
}
/*-李參數(shù),顯示詳細(xì)文件信息和節(jié)點(diǎn)號(hào)*/
void display _ LL _ IL(struct stat * stalist,char (*namelist)[LENGTH],int n)
{
int i,模式
字符*字符串
for(I=0;我
printf(“%-8d”,stalist[i].ST _ ino);
mode=stalist[i].st模式
if(S_ISDIR(mode))
printf(" d ");
其他
printf("-");
如果(模式(18))
printf(" r ");
其他
printf("-");
如果(模式(17))
printf(" w ");
其他
printf("-");
如果(模式(16))
printf(" x ");
其他
printf("-");
如果(模式(15))
printf(" r ");
其他
printf("-");
如果(模式(14))
printf(" w ");
其他
printf("-");
如果(模式(13))
printf(" x ");
其他
printf("-");
如果(模式(12))
printf(" r ");
其他
printf("-");
如果(模式(11))
printf(" w ");
其他
printf("-");
如果(模式(10))
printf(" x ");
其他
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 ",名稱列表[i]).
}
}
/*-R參數(shù),簡(jiǎn)單顯示所有文件,包括目錄下面的子目錄*/
void display _ RU(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode)
{
int i,計(jì)數(shù)
char path[LENGTH]={0},temp[LENGTH]={0} .
struct stat sta[MAX _ FILE _ COUNT];
字符名稱[最大文件數(shù)][長(zhǎng)度];
puts(get _ current _ dir _ name());
display_simply(namelist,n);
putchar(" \ n ");
strcpy(path,get _ current _ dir _ name());
for(I=0;我
if(strcmp(namelist[i],".")==0 || strcmp(namelist[i],".")==0)
繼續(xù);
if(S_ISDIR(stalist[i]).st_mode)){
strcpy(temp,path);
strcat(路徑,"/");
strcat(path,name list[I]);
count=文件列表(路徑,sta,名稱,模式);
display_RU(sta,name,count,mode);
strcpy(path,temp);
}
}
}
/*-Rl參數(shù),顯示所有文件,包括目錄下面的子目錄的詳細(xì)信息*/
void display _ RU _ LL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode)
{
int i,計(jì)數(shù)
char path[LENGTH]={0},temp[LENGTH]={0} .
struct stat sta[MAX _ FILE _ COUNT];
字符名稱[最大文件數(shù)][長(zhǎng)度];
puts(get _ current _ dir _ name());
display_LL(stalist,namelist,n);
putchar(" \ n ");
strcpy(path,get _ current _ dir _ name());
for(I=0;我
if(strcmp(namelist[i],".")==0 || strcmp(namelist[i],".")==0)
繼續(xù);
if(S_ISDIR(stalist[i]).st_mode)){
strcpy(temp,path);
strcat(路徑,"/");
strcat(path,name list[I]);
count=文件列表(路徑,sta,名稱,模式);
display_RU_LL(sta,name,count,mode);
strcpy(path,temp);
}
}
}
/*-Ri參數(shù),簡(jiǎn)單顯示所有文件,包括目錄下的子目錄,及節(jié)點(diǎn)號(hào)*/
void display _ RU _ IL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode)
{
int i,計(jì)數(shù)
char path[LENGTH]={0},temp[LENGTH]={0} .
struct stat sta[MAX _ FILE _ COUNT];
字符名稱[最大文件數(shù)][長(zhǎng)度];
puts(get _ current _ dir _ name());
display_IL(stalist,namelist,n);
putchar(" \ n ");
strcpy(path,get _ current _ dir _ name());
for(I=0;我
if(strcmp(namelist[i],".")==0 || strcmp(namelist[i],".")==0)
繼續(xù);
if(S_ISDIR(stalist[i]).st_mode)){
strcpy(temp,path);
strcat(路徑,"/");
strcat(path,name list[I]);
count=文件列表(路徑,sta,名稱,模式);
display_RU_IL(sta,name,count,mode);
strcpy(path,temp);
}
}
}
/*-里爾參數(shù),顯示所有文件,包括目錄下面的子目錄的詳細(xì)信息,及節(jié)點(diǎn)號(hào)*/
void display _ RU _ IL _ LL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode)
{
int i,計(jì)數(shù)
char path[LENGTH]={0},temp[LENGTH]={0} .
struct stat sta[MAX _ FILE _ COUNT];
字符名稱[最大文件數(shù)][長(zhǎng)度];
puts(get _ current _ dir _ name());
display_LL_IL(stalist,namelist,n);
putchar(" \ n ");
strcpy(path,get _ current _ dir _ name());
for(I=0;我
if(strcmp(namelist[i],".")==0 || strcmp(namelist[i],".")==0)
繼續(xù);
if(S_ISDIR(stalist[i]).st_mode)){
strcpy(temp,path);
strcat(路徑,"/");
strcat(path,name list[I]);
count=文件列表(路徑,sta,名稱,模式);
display_RU_IL_LL(sta,name,count,mode);
strcpy(path,temp);
}
}
}
//錯(cuò)誤處理函數(shù)
void error(char* error_message,int line)
{
char str[5];
sprintf(str," %d:",line);
strcat(str,error _ message);
佩羅爾(str);
退出(退出_失敗);
}
看了"linux模擬ls命令代碼"還想看:
1.ls命令怎么使用
2.Linux操作系統(tǒng)操作系統(tǒng)常用指令大全
3.解決文件傳輸協(xié)議(文件傳輸協(xié)議的縮寫)的目錄或限位開關(guān)(限位開關(guān))命令無法查看文件列表的辦法
4.怎么實(shí)現(xiàn)限位開關(guān)(限位開關(guān))命令在win7下正常運(yùn)行
本文到此結(jié)束,希望對(duì)大家有所幫助。
標(biāo)簽: 限位開關(guān) 所有文件 詳細(xì)信息