10.11 作业

将指定目录下所有文件的属性显示出来,类似 ls -l 一个指定目录

提示:

打开目录,

读取目录中的文件名

将路径和文件名拼接

传入给stat获取文件属性

#include <head.h>
void get_fileLimit(mode_t mode)
{
	char arr[]="rwx";
	for(int i=0;i<9;i++)
	{
		if((mode&(0400>>i))==0)
		{
			putchar('-');
			continue;
		}
		putchar(arr[i%3]);
	}

}//提取文件权限

void get_fileType(mode_t typ)
{
	switch(typ&S_IFMT)
	{
	case S_IFREG: putchar('-'); break;
	case S_IFDIR: putchar('f'); break;
	case S_IFCHR: putchar('c'); break;
	case S_IFBLK: putchar('b'); break;
	case S_IFIFO: putchar('p'); break;
	case S_IFLNK: putchar('l'); break;
	case S_IFSOCK: putchar('s'); break;
	}
}//提取文件类型

int main(int argc, const char *argv[])
{
	if(argc<2)
	{
		puts("请输入文件名:");
		return -1;
	}
	DIR* op=opendir(argv[1]);
	if(NULL==op)
	{
		ERR_MSG("opendir");
		return -1;
	}
	while(1)
	{
		struct dirent*re=readdir(op);
		if(re==NULL)
		{
			if(0==errno)
			{
				printf("目录读取完毕\n");
				break;
			}
			else
			{
				ERR_MSG("readdir");
				return -1;
			}
		}
		if(re->d_name[0]!='.')
		{

			char brr[20]="";
			char crr[5]="/";
			strcpy(brr,argv[1]);
			strcat(brr,crr);
			strcat(brr,re->d_name);

			struct stat buf;
			int ret=stat(brr,&buf);
			if(ret==-1)
			{
				ERR_MSG("stat");
				return -1;
			}
			//	printf("%o\n",buf.st_mode);
			get_fileLimit(buf.st_mode);
			get_fileType(buf.st_mode);

			printf("%d ",buf.st_uid);
			struct passwd* u_id=getpwuid(buf.st_uid);
			if(NULL==u_id)
			{
				ERR_MSG("getpwuid");
				return -1;
			}
			printf("%s ",u_id->pw_name);

			printf("%d ",buf.st_gid);
			struct group* g_id=getgrgid(buf.st_gid);
			if(NULL==g_id)
			{
				ERR_MSG("getpwuid");
				return -1;
			}
			printf("%s ",g_id->gr_name);

			printf("%lu ",buf.st_nlink);
			printf("%ld ",buf.st_size);
			//	printf("%ld\n",buf.st_atime);
			time_t on=buf.st_atime;
			struct tm* in=localtime(&on);
			printf("%d-%02d-%02d %02d:%02d:%02d ",in->tm_year+1900,in->tm_mon+1,in->tm_mday,in->tm_hour,in->tm_min,in->tm_sec);

			printf("%s\n",re->d_name);
		}
	}

	closedir(op);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值