IO 进程线程(文件属性,目录相关函数)2023.10.11

文章描述了一个C语言程序,用于在指定目录下获取所有非隐藏文件的属性,如文件类型、权限、大小、用户和组信息等,类似于Linux命令`ls-l`。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

提示:

打开目录,

读取目录中的文件名

将路径和文件名拼接

传入给stat获取文件属性

#include"head.h"
//获取文件类型
int get_fileType(mode_t m)
{
	switch(m & S_IFMT)
	{
	case S_IFREG: putchar('-'); break;
	case S_IFSOCK: putchar('s'); break;
	case S_IFLNK: putchar('l');break;
	case S_IFBLK: putchar('b'); break;
	case S_IFDIR: putchar('d'); break;
	case S_IFCHR: putchar('c'); break;
	case S_IFIFO: putchar('p'); break;
	}
	return 0;
}
 
//获取权限
int get_filePemission(mode_t mode)
{
	int a=0400;
	
	char per[]="rwx";
	
	for(int i=0;i<9;i++,a=a>>1)
	{
		if((mode& a) == 0)
		{
			putchar('-');
			continue;
		}
		else
		{
			putchar(per[i%3]);
		}
	}
		putchar(10);
		return 0;
	
}
 
int main(int argc, const char *argv[])
{	
	if(argc<2)
	{
		printf("please input great than one\n");
		return -1;
	}	
	char str[30]="";
 
	DIR* dirp = opendir(argv[1]);//打开目录
	if(NULL==dirp)
	{
		perror("open");
		return -1;
	}
	//printf("opendir success\n");
 
	struct dirent* rp=NULL;
	while(1)
	{
		bzero(str,sizeof(str));
		strcpy(str,argv[1]);
		rp=readdir(dirp);
 
 
		if(NULL==rp) 
		{
			if(0==errno)
			{
				//	printf("目录读取完毕\n");
				break;
			}
			else 
			{
				perror("readdir");
				return -1;
			}
		}
		//打印除了隐藏文件外的所有文件名
		if(rp->d_name[0] !='.')
		{
			struct stat buf;
			if(stat(strcat(str,rp->d_name),&buf)<0)
			{
				perror("stat");
				return -1;
			}
			//修改时间
			struct tm* info=localtime(&buf.st_ctime);
 
			//	printf("mode=0%o\n",buf.st_mode);
			//	printf("uid=%d\n",buf.st_uid);//uid
 
 
			struct passwd* pwd=getpwuid(buf.st_uid);
			if(NULL == pwd)
			{
				perror("getpwuid");
				return -1;
			}
 
 
			//printf("gid=%d\n",buf.st_gid);//文件所属组用户,gid
 
			struct group* grp =getgrgid(buf.st_gid);
			if(NULL==grp)
			{
				perror("getgrgid");
				return -1;
			}
 
			get_fileType(buf.st_mode);//文件类型
			get_filePemission(buf.st_mode);//文件权限
			printf("%ld ",buf.st_nlink);//硬链接个数
			printf("%s ",pwd->pw_name);//用户名字
			printf("%s ",grp->gr_name);//组用户名字
			printf("%ld ",buf.st_size);
			//	printf("%ld ",buf.st_ctime);//时间
			printf("%d %02d %02d %02d",info->tm_mon+1,info->tm_mday,info->tm_hour,info->tm_min);//时间
			printf("%s\n",rp->d_name);//文件名字
		}
	}
 
 
	closedir(dirp);//关闭目录
 
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值