打印指定目录下所有文件的状态信息

需求:

打印指定目录下所有文件的状态信息

代码实现过程:

func.c:

#ifndef __FUNC_H__
#define __FUNC_H__

//提取文件名
char *get_FileName(char pstr[64]);

//提取文件权限
char *get_FilePermission(mode_t mode,char pstr[10]);

//提取文件类型
char get_FileType(mode_t mode);

//提取文件所属用户
char *get_Filepwname(uid_t uid,char pstr[32]);

//提取文件所属组用户
char *get_Groupname(uid_t uid,char pstr[32]);

//转换文件时间至日历
void *get_calendar(time_t ctim);

#endif

#include<stdio.h>
#include<sys/types.h>
#include<dirent.h>
#include<errno.h>
#include<string.h>

func.h:

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

#define MSG_ERR(msg){\
	fprintf(stderr,"line : %d",__LINE__);\
	perror(msg);\
}

//提取文件名
char *get_FileName(char pstr[64]){
	DIR *dp = opendir("./");
	if(NULL==dp){
		MSG_ERR("diropen");
		return NULL;
	}

	struct dirent *rp = NULL;
	rp = readdir(dp);
	if(NULL==rp){
		if(errno != 0){
			MSG_ERR("readdir");
			return NULL;
		}
		else{
			return NULL;
		}
	}
	char s='.';
	if(strncmp(&s,rp->d_name,1)){
		//printf("%s",rp->d_name);  //返回值
		strcpy(pstr,rp->d_name);
		return pstr;
	}

	if(closedir(dp) < 0){
		MSG_ERR("closedir");
		return NULL;
	}

}

//提取文件权限
char *get_FilePermission(mode_t mode,char pstr[10]){//   2.返回值char*,形参为char pstr[10]的形式\
													起提示作用,提示在主函数传入一个数组\
													且长度为10
	int a = 0400;
	char str[3]={'r','w','x'};
	int i=0;
	while(i<9){
		if((mode & a))
			//putchar(str[(i)%3]);
			pstr[i]=str[i%3];						//若有权限,通过模除获得对应权限
		else
			//putchar('-');
			pstr[i]='-';							//若无权限,直接获得'-'
		a=a>>1;										//不断右移动,以以计算下一个权限
		i++;
	}
	//putchar(10);
	return pstr;                                   //传回主函数传进的地址
}

//提取文件类型
char get_FileType(mode_t mode)
{
	char c = 0;
	switch(mode & S_IFMT)
	{
	case S_IFSOCK: 	c = 's'; break;
	case S_IFLNK: 	c = 'l'; break;
	case S_IFREG: 	c = '-'; break;
	case S_IFDIR: 	c = 'd'; break;
	case S_IFBLK:   c = 'b'; break;
    case S_IFCHR:   c = 'c'; break;
	case S_IFIFO:   c = 'p'; break;
	default:printf("unknown?\n");break;
	}
	return c;
}

//提取文件所属用户
char *get_Filepwname(uid_t uid,char pstr[32]){
	struct passwd* pwd = getpwuid(uid);
	if(pwd==NULL){
#define MSG_ERR(msg){\
	fprintf(stderr,"line : %d",__LINE__);\
	perror("msg");\
}

		MSG_ERR("getpwuid");
	}
	//char str[32]=pwd->pw_name;
	strcpy(pstr,pwd->pw_name);
	//return pstr;
	//printf("%s\n",pwd->pw_name);
	return pstr;
}

//提取文件所属组用户
char *get_Groupname(gid_t gid,char pstr[32]){
	struct group* grp = getgrgid(gid);
	if(grp==NULL){
		MSG_ERR("getgrgid");
	}
	strcpy(pstr,grp->gr_name);
	return pstr;
}

//转换文件时间至日历
void *get_calendar(time_t ctim){
	char *mon[]={"一","二","三","四","五","六","七","八","九","十","十一","十二"}; //定义一个指针数组,每个指针指向一个字符串
	struct tm* info = NULL;
	info = localtime(&ctim); //获得日历结构体,并打印需要的成员
	printf("%s %2d %02d:%02d ",mon[info->tm_mon],info->tm_mday,info->tm_hour,info->tm_min);
}

StatCap.c:

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

#define MSG_ERR(msg){\
	fprintf(stderr,"line : %d",__LINE__);\
	perror(msg);\
}

//提取文件名
char *get_FileName(char pstr[64]){
	DIR *dp = opendir("./");
	if(NULL==dp){
		MSG_ERR("diropen");
		return NULL;
	}

	struct dirent *rp = NULL;
	rp = readdir(dp);
	if(NULL==rp){
		if(errno != 0){
			MSG_ERR("readdir");
			return NULL;
		}
		else{
			return NULL;
		}
	}
	char s='.';
	if(strncmp(&s,rp->d_name,1)){
		//printf("%s",rp->d_name);  //返回值
		strcpy(pstr,rp->d_name);
		return pstr;
	}

	if(closedir(dp) < 0){
		MSG_ERR("closedir");
		return NULL;
	}

}

//提取文件权限
char *get_FilePermission(mode_t mode,char pstr[10]){//   2.返回值char*,形参为char pstr[10]的形式\
													起提示作用,提示在主函数传入一个数组\
													且长度为10
	int a = 0400;
	char str[3]={'r','w','x'};
	int i=0;
	while(i<9){
		if((mode & a))
			//putchar(str[(i)%3]);
			pstr[i]=str[i%3];						//若有权限,通过模除获得对应权限
		else
			//putchar('-');
			pstr[i]='-';							//若无权限,直接获得'-'
		a=a>>1;										//不断右移动,以以计算下一个权限
		i++;
	}
	//putchar(10);
	return pstr;                                   //传回主函数传进的地址
}

//提取文件类型
char get_FileType(mode_t mode)
{
	char c = 0;
	switch(mode & S_IFMT)
	{
	case S_IFSOCK: 	c = 's'; break;
	case S_IFLNK: 	c = 'l'; break;
	case S_IFREG: 	c = '-'; break;
	case S_IFDIR: 	c = 'd'; break;
	case S_IFBLK:   c = 'b'; break;
    case S_IFCHR:   c = 'c'; break;
	case S_IFIFO:   c = 'p'; break;
	default:printf("unknown?\n");break;
	}
	return c;
}

//提取文件所属用户
char *get_Filepwname(uid_t uid,char pstr[32]){
	struct passwd* pwd = getpwuid(uid);
	if(pwd==NULL){
#define MSG_ERR(msg){\
	fprintf(stderr,"line : %d",__LINE__);\
	perror("msg");\
}

		MSG_ERR("getpwuid");
	}
	//char str[32]=pwd->pw_name;
	strcpy(pstr,pwd->pw_name);
	//return pstr;
	//printf("%s\n",pwd->pw_name);
	return pstr;
}

//提取文件所属组用户
char *get_Groupname(gid_t gid,char pstr[32]){
	struct group* grp = getgrgid(gid);
	if(grp==NULL){
		MSG_ERR("getgrgid");
	}
	strcpy(pstr,grp->gr_name);
	return pstr;
}

//转换文件时间至日历
void *get_calendar(time_t ctim){
	char *mon[]={"一","二","三","四","五","六","七","八","九","十","十一","十二"}; //定义一个指针数组,每个指针指向一个字符串
	struct tm* info = NULL;
	info = localtime(&ctim); //获得日历结构体,并打印需要的成员
	printf("%s %2d %02d:%02d ",mon[info->tm_mon],info->tm_mday,info->tm_hour,info->tm_min);
}

代码实现结果:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值