#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <pwd.h> #include <grp.h> #include <string.h> #include <time.h> //文件权限 void get_filePermission(mode_t m) { char str[4]="rwx"; int i=0; for(i=0;i<9;i++) { if((m&(0400>>i))==0) { putchar('-'); continue; } printf("%c",str[i%3]); } // puts(""); } //文件类型 char get_filetype(mode_t m) { switch (m&S_IFMT) { case S_IFBLK: return ('b'); break; case S_IFLNK: return ('l'); break; case S_IFREG: return ('-'); break; case S_IFSOCK: return ('s'); break; case S_IFDIR: return ('d'); break; case S_IFCHR: return ('c'); break; case S_IFIFO: return ('p'); break; default:return 0; } } //文件所属用户 char* get_pwdname(uid_t uid,char *ptr) { struct passwd* pwd=getpwuid(uid); if(NULL==pwd) { perror("getpwuid"); return NULL; } strcpy(ptr,pwd->pw_name); return ptr; } //文件所属组用户 char* get_grname(gid_t gid,char *ptr) { struct group* grp=getgrgid(gid); if(NULL==grp) { perror("gergrgid"); return NULL; } strcpy(ptr,grp->gr_name); return ptr; } int main(int argc, const char *argv[]) { if(argc<2) { fprintf(stderr,"请在命令行上输入一个文件名\n"); return -1; } struct stat buf; char a; char pwd[20]=""; char grp[20]=""; if(stat(argv[1],&buf)<0) { perror("stat"); return -1; } //文件的类型以及权限 //printf("st_mode:%o\n",buf.st_mode); a=get_filetype(buf.st_mode); printf("%c",a); get_filePermission(buf.st_mode); //硬链接个数 printf(" %ld ",buf.st_nlink); //文件所属用户 get_pwdname(buf.st_uid,pwd); printf("%s ",pwd); //puts(pwd); //printf("st_uid:%d\n",buf.st_uid); //文件所属组用户 get_grname(buf.st_uid,grp); printf("%s ",grp); //puts( grp); //printf("st_gid:%d\n",buf.st_gid); //文件大小 printf("%ld ",buf.st_size); //时间 //printf("st_ctime:%ld\n",buf.st_ctime); struct tm *info=NULL; info=localtime(&buf.st_ctime); printf("%02d-%02d %02d:%02d ",\ info->tm_mon+1,\ info->tm_mday,info->tm_hour,info->tm_min); //文件名 printf("%s\n",argv[1]); return 0; }
运行结果