linux下ls-l命令

来源:互联网 发布:js图像热点链接 编辑:程序博客网 时间:2024/05/19 00:39
#include<stdio.h> #include <sys/ioctl.h>#include<sys/types.h>#include<dirent.h>#include<unistd.h>#include <string.h>#define N 256#include<stdlib.h>char arry[N][N];void do_ls(char []);int get_clo();main(int ac,char *av[]){if(ac==1)do_ls(".");elsewhile(--ac){printf("%s:\n",*++av);do_ls(*av);}}int get_clo() //获取此时屏幕的宽度  {struct winsize size; if (isatty(STDOUT_FILENO) == 0)return 0;if(ioctl(STDOUT_FILENO, TIOCGWINSZ, &size)<0){ perror("ioctl TIOCGWINSZ error");  return 0;} return size.ws_col;}void do_ls(char dirname[]){    DIR *dir_ptr;char *x;    struct dirent *direntp;int i = 0;int count=0;int j=0;int b=0;int length=0,num=0;int screen_clo;screen_clo=get_clo(); x=(char *)malloc(30*sizeof(char));    if((dir_ptr=opendir(dirname))==NULL)        fprintf(stderr,"ls1:cannot open %s\n",dirname);    else{while((direntp=readdir(dir_ptr))!=NULL) {    strcpy(arry[i],direntp->d_name);i++;count++;}for(i=0;i<count;i++)//冒泡排序,把文件名长的排在后面  for(j=0;j<count-i-1;j++){if (strlen(arry[j])>strlen(arry[j+1])){strcpy(x,arry[j]);strcpy(arry[j],arry[j+1]);strcpy(arry[j+1],x);}}for(i=0;i<count;i++)//求出所有文件中文件名最长的文件长度{while(length<strlen(arry[i])){length=strlen(arry[i]);}}num=screen_clo/(length+3);printf("%d\n%d\n",count,num); //文件数和列数for(i=0;i<count;i++){printf("%s",arry[i]);for(b=0;b<((length+3)-strlen(arry[i]));b++)//文件和最长文件比较,少的长度用空格添加printf(" ");if(i!=0){if((i+1)%num==0){printf("\n");}}}printf("\n");closedir(dir_ptr);}}

原创粉丝点击