#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(".");
else
while(--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);
}
}
linux下ls-l命令
最新推荐文章于 2024-10-02 00:49:38 发布