linux模拟ls命令代码代码如下:
/*
模拟限位开关(限位开关)命令,实现参数-塔里尔。有些代码重复出现,可改进
(资料图)
可以在该程序的基础上增加参数,该程序思路清晰,容易扩展
*/
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义LL (10) /*带l参数标志*/
#定义白细胞介素11) /*带我参数标志*/
#定义RU (12) /*带稀有参数标志*/
#定义TL (116) /*带t参数标志*/
#定义铝(117) /*带a参数标志*/
#定义RL (118) /*带r参数标志*/
#定义长度500 /*字符串最大长度*/
#定义最大文件计数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(* 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);
/*主函数*/
int main(int argc,char **argv)
{
int i,j;
/*模式的前16个位用来标志那些能影响显示的参数,16位之后的位用来标志不影响输出格式的参数。这个程序只用到了0-3位,16-18位,如果要在该程序的基础上增加参数,可以用其他没有使用的位。
方式的第0位为一表示带l参数,模式的第一位为一表示带我参数,模式的第2位为一表示带稀有参数,模式的第16位为一表示带t参数,模式的第17位为一表示带a参数,模式的第18位为一表示带r参数*/
int mode=0;
char error _ message[LENGTH]={ 0 };/*错误信息*/
char path[LENGTH]={ 0 };/*路径*/
struct stat stalist[MAX _ FILE _ COUNT];/*文件详细信息数组*/
字符名称列表[MAX _ FILE _ COUNT][LENGTH];/*文件名数组*/
int flag=0;/*判断是否指定了目录*/
(同Internationalorganizations)国际组织计数;/*文件个数*/
/*解析参数*/
for(I=1;我
if(argv[i][0]=="-"){/*如果是选项参数*/
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]);
错误(错误消息,__行_ _);
}
}
}else{/*参数为目录或文件*/
if(flag==1)
错误("不能指定两个以上的目录或文件",_ _ LINE _ _);
其他
flag=1;
if(argv[i][0]!="/"){/*相对路径*/
strcat(path,get _ current _ dir _ name());
strcat(路径,"/");
strncat(path,argv[i],strlen(argv[I]);
}else/*绝对路径*/
strcpy(path,argv[I]);
}
}
if(flag==0)/*未指定任何目录或文件,则使用默认当前目录*/
strcat(path,get _ current _ dir _ name());
/*根据方式获取指定目录下的文件*/
count=file_list(path,stalist,namelist,mode);
/*根据方式显示文件*/
显示(列表、名称列表、计数、模式);
返回0;
}
/*获取文件列表*/
int file_list(char* path,struct stat* stalist,char (*namelist)[LENGTH],int mode)
{
int i=0,index,j,k;
目录*目录
结构方向* ptr
char str[LENGTH];
char name temp[LENGTH];
结构状态状态
if(stat(path,stalist[0])0){
//puts(路径);
错误("指定文件不存在,_ _ LINE _ _);
}
if(S_ISDIR(stalist[0]).st_mode)){/*如果该路径指向的是一个目录*/
if((dir=opendir(path))==NULL){/*打开目录*/
sprintf(str,无法打开“%s”,路径);
error(str,_ _ LINE _ _);
}
chdir(路径);/*改变当前工作目录到路径*/
I=0;
while((ptr=readdir(dir))!=NULL){/*依次读取目录下的所有文件*/
if(ptr-d_name[0]==" . "!(模式a1))/*忽略隐藏文件*/
继续;
/*按字母顺序插入到跟踪者数组及名字表数组*/
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==最大文件数)
错误("文件计数超出" MAX_FILE_COUNT ",_ _ LINE _ _);
}
closedir(dir);
}否则{
j=strlen(path)-1;
while(j=0 path[j]!="/"){
j-;
}
如果(j0)
错误("路径错误,_ _ LINE _ _);
j;
k=0;
while(path[j]){
名称列表[0][k]=路径[j];
j;
k;
}
名称列表[0][k]=0;
返回1;
}
如果(模式TL){/*按文件修改时间排序*/
for(j=0;j
index=j;
for(k=j ^ 1;k
if(stalist[index].圣彼得堡时间
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;
}
}
返回我;
}
/*根据方式选择不同的函数进行显示*/
void display(struct stat* stalist,char (*namelist)[LENGTH],int n,int mode)
{
/*使方式的高16位为0*/
int m=mode((116)-1);
开关(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);
打破;
}
}
/*不带显示选项,简单显示文件名*/
void display _ simply(char(* name list)[LENGTH],int n)
{
int i,maxlength=0,cols
结构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参数,显示详细文件信息*/
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]).
}
}
/*-我参数,显示文件名及节点号*/
void display _ IL(struct stat * stalist,char (*namelist)[LENGTH],int n)
{
int i,maxlength=0,cols
结构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 ");
}
/*-李参数,显示详细文件信息和节点号*/
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参数,简单显示所有文件,包括目录下面的子目录*/
void display _ RU(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode)
{
int i,计数
char path[LENGTH]={0},temp[LENGTH]={0} .
struct stat sta[MAX _ FILE _ COUNT];
字符名称[最大文件数][长度];
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)
继续;
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参数,显示所有文件,包括目录下面的子目录的详细信息*/
void display _ RU _ LL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode)
{
int i,计数
char path[LENGTH]={0},temp[LENGTH]={0} .
struct stat sta[MAX _ FILE _ COUNT];
字符名称[最大文件数][长度];
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)
继续;
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参数,简单显示所有文件,包括目录下的子目录,及节点号*/
void display _ RU _ IL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode)
{
int i,计数
char path[LENGTH]={0},temp[LENGTH]={0} .
struct stat sta[MAX _ FILE _ COUNT];
字符名称[最大文件数][长度];
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)
继续;
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);
}
}
}
/*-里尔参数,显示所有文件,包括目录下面的子目录的详细信息,及节点号*/
void display _ RU _ IL _ LL(struct stat * stalist,char (*namelist)[LENGTH],int n,int mode)
{
int i,计数
char path[LENGTH]={0},temp[LENGTH]={0} .
struct stat sta[MAX _ FILE _ COUNT];
字符名称[最大文件数][长度];
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)
继续;
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);
}
}
}
//错误处理函数
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操作系统操作系统常用指令大全
3.解决文件传输协议(文件传输协议的缩写)的目录或限位开关(限位开关)命令无法查看文件列表的办法
4.怎么实现限位开关(限位开关)命令在win7下正常运行
本文到此结束,希望对大家有所帮助。