代码:
#include <stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
//构造文件权限转化字符形式函数
void change_mod(mode_t m)
{
//创建一个储存'r''w''x'的数组用来提取'r''w''x'
char arr[]="rwx";
//循环对比权限的八进制数和rwx
for(int i=0;i<9;i++)
{
if((m&(0400>>i))==0)
{
putchar('-');
}
else
{
fprintf(stdout,"%c",arr[i%3]);
}
}
}
//构造文件类型转为字符函数
void change_type(mode_t n)
{
switch(S_IFMT&n)
{
case S_IFSOCK:
putchar('s');
break;
case S_IFLNK:
putchar('l');
break;
case S_IFREG:
putchar('-');
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;
default: printf("mode错误\n");
}
}
//封装uid转字符类型函数
void change_uid(uid_t a)
{
struct passwd* b=getpwuid(a);
printf(" %s ",b->pw_name);
}
//封装gid转字符类型函数
void change_gid(uid_t a)
{
struct group* b=getgrgid(a);
printf("%s ",b->gr_name);
}
//封装时间转日历格式函数
void time_size(time_t a)
{
struct tm* b=localtime(&a);
//定义一个中文月份的数组
char *arr[13]={0,0,0};
arr[0]="一月";
arr[1]="二月";
arr[2]="三月";
arr[3]="四月";
arr[4]="五月";
arr[5]="六月";
arr[6]="七月";
arr[7]="八月";
arr[8]="九月";
arr[9]="十月";
arr[10]="十一";
arr[11]="十二";
fprintf(stdout,"%s %d %02d:%02d ",arr[b->tm_mon],b->tm_mday,b->tm_hour,b->tm_min);
}
/***************************************主函数***********************************************/
int main(int argc, const char *argv[])
{
struct stat buf; //设置stat结构体类型的变量
//提取文件所有属性
stat("./typefile.c",&buf); //通过变量取地址来存储文件属性
//通过结构体变量访问文件类型+文件权限
printf("%o\n",buf.st_mode);
//调用文件权限转化字符形式函数
change_mod(buf.st_mode);
//调用文件类型转化为字符形式函数
change_type(buf.st_mode);
//通过结构体变量访问硬连接数
printf("%ld\n",buf.st_nlink);
//通过结构体变量访问用户名
printf("%d\n",buf.st_uid);
//调用uid转字符函数
change_uid(buf.st_uid);
//通过结构体变量访问用户组名
printf("typefile.c\n");
printf("%d\n",buf.st_gid);
//调用gid转字符函数
change_gid(buf.st_gid);
//通过结构体变量访问文件大小
printf("%ld",buf.st_size);
//通过结构体变量访问日期
printf("%ld\n",buf.st_atime);
//输出文件名
printf("typefile.c\n");
printf("各功能展示完毕,下面展示终端ls -l最终效果>>>>>>>>>\n");
printf("**************************************************\n");
printf("**************************************************\n");
printf("**************************************************\n");
printf("**************************************************\n");
//文件类型
change_type(buf.st_mode);
//文件权限
change_mod(buf.st_mode);
//uid
change_uid(buf.st_uid);
//gid
change_gid(buf.st_gid);
//文件大小
printf("%ld ",buf.st_size);
//日期
time_size(buf.st_atime);
//文件名
printf("typefile.c\n");
return 0;
}
效果:
![](https://img-blog.csdnimg.cn/img_convert/046a6e9410c729e69f822ed394afc15f.png)