题目:输出文件属性
代码:
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<time.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include <pwd.h>
#include <grp.h>
void get_FTime(struct stat buf)
{
char *mon[12]={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一","十二"};
struct tm* info=NULL;
info=localtime(&buf.st_ctime);
printf("%s %d %02d:%02d",mon[info->tm_mon],info->tm_mday,info->tm_hour,info->tm_min);
}
void get_FG(struct stat buf)
{
struct group* grp = getgrgid(buf.st_gid);
if(NULL == grp)
{
perror("getgrgid");
return;
}
printf("%s", grp->gr_name);
}
void get_FU(struct stat buf)
{
struct passwd* pwd = getpwuid(buf.st_uid);
if(NULL == pwd)
{
perror("getpwuid");
return ;
}
printf("%s", pwd->pw_name);
}
char *get_FP(mode_t mode,char pstr[10])
{
int a=0400;
char b[3]="rwx";
int i=0,j=0;
while(a!=0)
{
if((mode&a)!=0) pstr[j]=b[i];
else pstr[j]='-';
a=a>>1;
i++;
if(i==3)i=0;
j++;
}
return pstr;
}
char get_FT(mode_t mode)
{
if(S_ISREG(mode)) return '-';
else if(S_ISDIR(mode)) return 'd';
else if(S_ISCHR(mode)) return 'c';
else if(S_ISBLK(mode)) return 'b';
else if(S_ISFIFO(mode)) return 'p';
else if(S_ISLNK(mode)) return 'l';
else if(S_ISSOCK(mode)) return 's';
}
int main(int argc, const char *argv[])
{
char pst[10]=" ";
struct stat buf;
if(stat(argv[1],&buf)<0)
{
perror("stat");
return -1;
}
printf("%c",get_FT(buf.st_mode));
printf("%s",get_FP(buf.st_mode,pst));
printf(" ");
printf("%ld",buf.st_nlink);
printf(" ");
get_FU(buf);
printf(" ");
get_FG(buf);
printf(" ");
printf("%ld",buf.st_size);
printf(" ");
get_FTime(buf);
printf(" ");
printf("%s\n",argv[1]);
return 0;
}
运行结果:
ubuntu@ubuntu:~$ ./a.out b.c
-rw-rw-r-- 1 ubuntu ubuntu 186176 十二 7 11:12 b.c