2022.7.29 作业

1、使用IO函数实现“ls  -l  路径”的效果

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>

int get_file(char *fname,DIR *dp);
int get_char_mode(mode_t mode);
int get_usrname(uid_t uid);
int get_grpname(gid_t gid);
int get_time(time_t sec);
void ls_only_file(struct stat buf,const char *fname);

int main(int argc, const char *argv[])
{
	if(argc<2){
		fputs("传参不足\n",stderr);
		return -1;
	}
	char fname[256];
	char pathname[256];
	int res;
	struct stat buf;
	DIR *dp=opendir(argv[1]);
	if(NULL==dp){
		perror("opendir");
		return -1;
	}
	while(1){
		bzero(fname,sizeof(fname));
		bzero(pathname,sizeof(pathname));
		res=get_file(fname,dp);
		strcpy(pathname,argv[1]);
		strcat(pathname,fname);
		
		if(-1==res){
			fputs("读取有误\n",stderr);
			closedir(dp);
			return -1;
		}else if(1==res){
			fputs("目录读取完毕\n",stdout);
			break;
		}else if(2==res){
			if(stat(pathname,&buf)<0){
				fputs("stat failed\n",stderr);
				closedir(dp);
				return -1;
			}
			ls_only_file(buf,fname);
		}
	}
	closedir(dp);

	return 0;
}

int get_file(char *fname,DIR *dp)
{
	int i;
	struct dirent *rp=NULL;

	rp=readdir(dp);
	if(NULL==rp){
		if(errno==0){
			return 1;
		}else{
			perror("readdir");
			return -1;
		}
	}
	if(rp->d_name[0]!='.'){
		for(i=0;i<strlen(rp->d_name);i++){
			fname[i]=rp->d_name[i];
		}
		fname[i]=0;
		return 2;
	}

	return 0;
}

int get_char_mode(mode_t mode)
{
	switch (mode & S_IFMT) {
	case S_IFBLK:  printf("b");         break;
	case S_IFCHR:  printf("c");         break;
	case S_IFDIR:  printf("d");         break;
	case S_IFIFO:  printf("p");         break;
	case S_IFLNK:  printf("l");         break;
	case S_IFREG:  printf("-");         break;
	case S_IFSOCK: printf("s");         break;
	default:       printf("unknown?");  break;
	}

	for(int i=8;i>=0;i--){
		if((mode&(1<<i))!=0){
			if(i%3==2){
				printf("r");
			}else if(i%3==1){
				printf("w");
			}else{
				printf("x");
			}
		}else{
			printf("-");
		}
	}
	return 0;
}

int get_usrname(uid_t uid)
{
	struct passwd *pd=getpwuid(uid);
	if(NULL==pd){
		return -1;
	}
	printf(" %s",pd->pw_name);
	return 0;
}

int get_grpname(gid_t gid)
{
	struct group *gp=getgrgid(gid);
	if(NULL==gp){
		return -1;
	}
	printf(" %s",gp->gr_name);
	return 0;
}

int get_time(time_t sec)
{
	struct tm *info=localtime(&sec);
	if(NULL==info){
		return -1;
	}
	printf(" %d月  %d %02d:%02d",info->tm_mon+1,info->tm_mday,\
			info->tm_hour,info->tm_min);
	return 0;
}

void ls_only_file(struct stat buf,const char *fname)
{
	get_char_mode(buf.st_mode);
	printf(" %ld",buf.st_nlink);
	get_usrname(buf.st_uid);
	get_grpname(buf.st_gid);
	printf(" %5ld",buf.st_size);
	get_time(buf.st_ctime);
	printf(" %s\n",fname);
}

测试:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值