linux下ls-l命令

#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);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值