IO进程线程->目录IO->day3

目录

一、目录IO函数

1.1 opendir

2.2 closedir

2.3 readdir

二、文件所属用户名函数

三、文件所属组用户名函数

四、主函数

五、执行结果


作业:

        请使用目录相关函数以及文件属性相关函数实现:

                显示指定路径下所有文件属性的功能(除了隐藏 文件)。 类似 ls -l 一个目录


 一、目录IO函数

1.1 opendir

功能:打开目录;

头文件

        #include <sys/types.h>

        #include <dirent.h>

原型:DIR *opendir(const char *name);

参数

        char *name:指定要打开的目录路径以及目录名;

返回值:

        成功,返回目录流指针;

        失败,返回NULL;

2.2 closedir

功能:关闭目录 ;
头文件:
        #include <sys/types.h>
        #include <dirent.h>
原型:int closedir ( DIR * dirp );
        DIR * dirp:要关闭的指向打开文件的指针 ;

2.3 readdir

功能:读取目录 ;
头文件:
        #include <dirent.h>
原型:
        struct dirent * readdir ( DIR * dirp );
参数
        DIR *dirp:指定要读取的目录的流指针;
返回值
        成功,返回存储读取到的数据的结构体指针;
        失败,返回NULL;更新errno; 读取到目录结尾,返回NULL,不更新errno;

二、文件所属用户名函数

传入文件所属用户的Linux用户编号,打印出他在系统里的文件所属用户名

//文件所属用户名
int get_uername(uid_t uid)
{
	struct passwd* pwd=getpwuid(uid);
	if(NULL == pwd)
	{
		printf("getpwuid failed\n");
		return -1;
	}
	printf("%s\t",pwd->pw_name);
	return 0;
}


 三、文件所属组用户名函数

传入文件所属组用户的Linux用户编号,打印出他在系统里的文件所属组用户名

//文件所属组用户名
int get_grpnanme(gid_t gid)
{
	struct group* grp =getgrgid(gid);
	if(NULL == grp)
	{
		printf("getgrgid failed\n");
		return -1;
	}
	printf("%s\t",grp->gr_name);

	return 0;
}


四、主函数

main.c

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

//文件所属组用户名
int get_grpnanme(gid_t gid)
{
	struct group* grp =getgrgid(gid);
	if(NULL == grp)
	{
		printf("getgrgid failed\n");
		return -1;
	}
	printf("%s\t",grp->gr_name);

	return 0;
}

//文件所属用户名
int get_uername(uid_t uid)
{
	struct passwd* pwd=getpwuid(uid);
	if(NULL == pwd)
	{
		printf("getpwuid failed\n");
		return -1;
	}
	printf("%s\t",pwd->pw_name);
	return 0;
}

int main(int argc, const char *argv[])
{
	DIR *p=opendir(argv[1]);//读取外部传参,并打开所在位置的目录
	if(NULL == p) 			//判断是否成功
	{
		perror("opendir");
		return -1;
	}

	struct dirent* rp=NULL;//定义同类型指针
	while(1)
	{
		rp=readdir(p); 		//用上面定义指针接收打开目录下的文件名
		if(NULL == rp) 		//判断是否成功
		{
			if(0 == errno) 	//由于接收失败和读取到结尾都是返回NULL需要再判断
			{
				printf("目录读取完毕\n");
				break;
			}else{
				printf("perror");
				return -2;
			}

		}
		if(rp->d_name[0] == '.') //由于题目需要避开隐藏文件,而隐藏文件都以"."开头
								//判断当前路径下是否有隐藏路径Linux指令为:ls -a
		{
		}else
		{
			struct stat buf; //需定义一个与调用函数同类型的结构体,接函数返回结构体
			char b[100]={0};
			strcpy(b,argv[1]);
			strcmp(b,rp->d_name);//因为外部传入的只是目录的绝对地址,没有加上文件名    
  								//所以需要定义一个字符数组来接收。
			int a=stat(b,&buf);//这个函数没有封装,忘了。buf用来接收这个文件的一切信息
			if(a<0)//判断是否成功
			{
				perror("stat");
				return -3;
			}

			int i=8;
			while(i >= 0)
			{
				int res=(buf.st_mode&(1<<i)); //文件权限八进制转换成Linux的文件权限显示方式
				if(8 ==i)
				{
				 printf("-");
				}
				if(res && i%3==2)
				{
					printf("r");
				}else if(res && i%3==1)
				{
					printf("w");
				}else if(res && i%3==0)
				{
					printf("x");
				}else
				{
					printf("-");
				}
				i--;
			}
			printf("--");

			printf("\t%ld\t",buf.st_nlink); 					//输出硬链接数
			//printf("uid:%d<-->",buf.st_uid);
			get_uername(buf.st_uid); 							//输出文件所属用户名
			//printf("文件类型:%o\n",buf.st_mode);
			//printf("gid:%d<-->",buf.st_gid);
			get_grpnanme(buf.st_gid); 							//文件所属组用户名
			printf("%ld\t",buf.st_size); 						//文件大小字节数
			//printf("文件创建日期:%ld\n",buf.st_ctime);
			struct tm *info=localtime(&buf.st_ctime); 			//定义一个结构体指针接收获取的本地时间
			printf("%d-%02d-%02d %02d:%02d:%02d\t",\
					info->tm_year+1900, info->tm_mon+1, info->tm_mday,\
					info->tm_hour, info->tm_min, info->tm_sec);//输出格式
			printf("%s\n",rp->d_name); 							//输出文件名

		}
	}
	closedir(p);
	return 0;
}

五、执行结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值