IO day3

类似 ls -l 的函数

引用的头文件和宏定义

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


//判错后的回复
#define PER(per) {	fprintf(stderr,"line: %d ",__LINE__);\
		perror(per);\
		return;}

将获得的文件权限信息转化为"rwx-"的形式

//文件的权限
int file_power(mode_t m,char *per)
{
	int i=8;
	while(i>-1)
	{
		char x;
		switch(i%3)
		{
		case 2:x='r';
				break;
		case 1:x='w';
				break;
		case 0:x='x';
				break;
		}

		if((m & 1<<i )!=0)
		{
		//	printf("%c",x);
			per[8-i]=x;
		}
		else
		{
		//	printf("-");
			per[8-i]='-';
		}
		i--;
	}
	per[9]='\0';
	return 0;
}

将文件属性转化为“bcd-lsp”

//文件的属性
int get_fileType(mode_t m,char* p)
{
	 switch (m & S_IFMT) 
	 {
     case S_IFBLK:  *p='b';        break;
     case S_IFCHR:  *p='c';        break;
     case S_IFDIR:  *p='d';        break;
     case S_IFIFO:  *p='p';        break;
     case S_IFLNK:  *p='l';        break;
 	 case S_IFREG:  *p='-';        break;
     case S_IFSOCK: *p='s';        break;
     default:       printf("unknown?\n");  break;
     }
	 return 0;

}

通过uid获得文件的所属用户名

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

通过gid获得文件的所属组用户名

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

通过文件名显示文件详细信息

//显示文件详细信息
void show(const char *name)
{
	//获取文件信息
	struct stat buf;
	if(	stat(name,&buf)<0)
	{
		PER("stat");
	}


	//文件类型以及权限
	char p;
	get_fileType(buf.st_mode,&p);        //类型
	char per[20];
	file_power(buf.st_mode,per);        //权限
	printf("%c%s ",p,per);          //输出类型和权限

	//硬链接数
	printf("%ld ",buf.st_nlink);    //输出硬链接数
	
	//文件所属用户
	char u[20]="";
	get_usrname(buf.st_uid,u);
	printf("%s ",u);            //输出所属用户名


	//文件所属组用户
	char g[20]="";
	get_grpname(buf.st_gid,g);
	printf("%s ",g);            //输出所属组用户名


	//文件大小
	printf("%ld ",buf.st_size);       //输出文件大小
	
	//文件创建日期
		//计算时间
	struct tm* info=localtime(&buf.st_ctime);
		//输出时间
	printf("%d-%02d-%02d %02d:%02d ",info->tm_year+1900,info->tm_mon+1,info->tm_mday,
											info->tm_hour,info->tm_min);
											
	//文件名
	printf("%s\n",name);

}

从目录里读取文件名,并显示文件详细信息(不包括隐藏文件)

//从目录里读取普通文件名,并显示文件详细信息
void dir_ll(const char *dir)
{
	//打开目录
	DIR* dp=opendir(dir);
	if(NULL==dp)
	{
		PER("opendir");
	}
	
	//读取目录信息
	struct dirent* rp=NULL;
	while (1)
	{
		int i=1;
		rp=readdir(dp);
	
		//判断是否正常结束
		if (NULL==rp)
		{
			if(0==errno)
			{
				if(i%6!=0)
					printf("\n");
				printf("目录读取完毕\n");
				break;
			}
		
			else
			{
				PER("readdir");
			}
		}
		//判断文件是否是隐藏文件,是就跳过进入下一个循环
		if('.'==rp->d_name[0])
		{
			continue;
		}

		char n[100]=""; //文件地址=目录地址+文件名
		strcat(n,dir);
		strcat(n,rp->d_name);
		show(n);
		i++;
	}
	

	closedir(dp);
	
}

主函数

//主函数
int main(int argc, const char *argv[])
{

	dir_ll(argv[1]);
	return 0;
}

全部函数

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


//判错后的回复
#define PER(per) {	fprintf(stderr,"line: %d ",__LINE__);\
		perror(per);\
		return;}

//文件的权限
int file_power(mode_t m,char *per)
{
	int i=8;
	while(i>-1)
	{
		char x;
		switch(i%3)
		{
		case 2:x='r';
				break;
		case 1:x='w';
				break;
		case 0:x='x';
				break;
		}

		if((m & 1<<i )!=0)
		{
		//	printf("%c",x);
			per[8-i]=x;
		}
		else
		{
		//	printf("-");
			per[8-i]='-';
		}
		i--;
	}
	per[9]='\0';
	return 0;
}

//文件的属性
int get_fileType(mode_t m,char* p)
{
	 switch (m & S_IFMT) 
	 {
     case S_IFBLK:  *p='b';        break;
     case S_IFCHR:  *p='c';        break;
     case S_IFDIR:  *p='d';        break;
     case S_IFIFO:  *p='p';        break;
     case S_IFLNK:  *p='l';        break;
 	 case S_IFREG:  *p='-';        break;
     case S_IFSOCK: *p='s';        break;
     default:       printf("unknown?\n");  break;
     }
	 return 0;

}

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

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


//显示文件详细信息
void show(const char *name)
{
	//获取文件信息
	struct stat buf;
	if(	stat(name,&buf)<0)
	{
		PER("stat");
	}


	//文件类型以及权限
	char p;
	get_fileType(buf.st_mode,&p);        //类型
	char per[20];
	file_power(buf.st_mode,per);        //权限
	printf("%c%s ",p,per);          //输出类型和权限

	//硬链接数
	printf("%ld ",buf.st_nlink);    //输出硬链接数
	
	//文件所属用户
	char u[20]="";
	get_usrname(buf.st_uid,u);
	printf("%s ",u);            //输出所属用户名


	//文件所属组用户
	char g[20]="";
	get_grpname(buf.st_gid,g);
	printf("%s ",g);            //输出所属组用户名


	//文件大小
	printf("%ld ",buf.st_size);       //输出文件大小
	
	//文件创建日期
		//计算时间
	struct tm* info=localtime(&buf.st_ctime);
		//输出时间
	printf("%d-%02d-%02d %02d:%02d ",info->tm_year+1900,info->tm_mon+1,info->tm_mday,
											info->tm_hour,info->tm_min);

	//文件名
	printf("%s\n",name);

	
}


//从目录里读取普通文件名,并显示文件详细信息
void dir_ll(const char *dir)
{
	//打开目录
	DIR* dp=opendir(dir);
	if(NULL==dp)
	{
		PER("opendir");
	}
	
	//读取目录信息
	struct dirent* rp=NULL;
	while (1)
	{
		int i=1;
		rp=readdir(dp);
	
		//判断是否正常结束
		if (NULL==rp)
		{
			if(0==errno)
			{
				if(i%6!=0)
					printf("\n");
				printf("目录读取完毕\n");
				break;
			}
		
			else
			{
				PER("readdir");
			}
		}
		//判断文件是否是隐藏文件,是就跳过进入下一个循环
		if('.'==rp->d_name[0])
		{
			continue;
		}

		char n[100]="";
		strcat(n,dir);
		strcat(n,rp->d_name);
		show(n);
		i++;
	}
	

	closedir(dp);


	
}

//主函数
int main(int argc, const char *argv[])
{

	dir_ll(argv[1]);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值