#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
char *get_st_mode2(mode_t m,char p[10])//将st_mode传参
{
/*
int i;
for(i=0;i<9;i++)
{
if(m&(0400>>i)!=0400)
{
putchar('-');
continue;
}
switch(i)
{
case 0:
case 3:
case 6:
{
putchar('r');
break;
}
case 1:
case 4:
case 7:
{
putchar('w');
break;
}
case 2:
case 5:
case 8:
{
putchar('x');
break;
}
}
}*/
int i;
char arr[4]="rwx";
for(i=0;i<9;i++)
{
if((m&(0400>>i))==0)
{
p[i]='-';
continue;
}
p[i]=arr[i%3];
}
return p;
}
//文件类型
char get_st_mode1(mode_t m)
{
switch(m&S_IFMT)
{
case S_IFSOCK: return('s'); break;
case S_IFLNK: return('l'); break;
case S_IFREG: return('-'); break;
case S_IFDIR: return('d'); break;
case S_IFBLK: return('b'); break;
case S_IFCHR: return('c'); break;
case S_IFIFO: return('p'); break;
}
}
int main(int argc, const char *argv[])
{
if(argc<2)
{
printf("请从命令行输入文件名\n");
}//判断运行时是否读取到
struct stat buf;//定义一个stat类型的结构体变量
if(stat(argv[1],&buf)<0)//判断stat函数执行是否出错
{
perror("stat");
return -1;
}
//文件类型
char tp;
tp=get_st_mode1(buf.st_mode);
printf("%c",tp);
//文件的权限
//printf("st_mode :%o\n",buf.st_mode);
char p[10]="";
get_st_mode2(buf.st_mode,p);
printf("%s ",p);
//硬链接数
printf("%ld ",buf.st_nlink);
//文件所属用户
struct passwd *u=getpwuid(buf.st_uid);
printf("%s ",u->pw_name);
//printf("st_uid%d\n",buf.st_uid);
//文件所属组用户
struct group *g=getgrgid(buf.st_uid);
printf("%s ",g->gr_name);
//printf("st_gid%d\n",buf.st_gid);
//文件大小
printf("%ld ",buf.st_size);
//时间
struct tm *info=NULL;
time_t t=buf.st_ctime;
info=localtime(&t);
printf("%d %d %d:%d ",info->tm_mon+1,\
info->tm_mday,info->tm_hour,\
info->tm_min);
//printf("st_ctime=%ld\n",buf.st_ctime);
//打印路径
printf("%s\n",argv[1]);
return 0;
}