需求:
打印指定目录下所有文件的状态信息
代码实现过程:
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);
}
代码实现结果: