#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <errno.h>
#include <dirent.h>
#include <string.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 print(const char *dir_c)
{
struct stat buf;//定义一个stat类型的结构体变量
if(stat(dir_c,&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",dir_c);
return 0;
}
int main(int argc, const char *argv[])
{
if(argc<2)
{
fprintf(stderr,"没有调用目录路径\n");
return -1;
}
//打开目录
DIR* dr = opendir(argv[1]);
if(dr== NULL)
{
perror("opendir");
return -1;
}
struct dirent* rd=NULL;
int i;
char dirs[64]="";
while(1)
{
rd = readdir(dr);
if(rd==NULL)
{
if(0 == errno)
{
printf("读取完毕\n");
return 0;
}
else
{
perror("readdir");
return -1;
}
}
if((rd->d_name[0])=='.')
{
continue;
}
printf("%s",rd->d_name);
strcpy(dirs,argv[1]);
strcat(dirs,rd->d_name);
print(dirs);
}
//关闭目录
if(closedir(dr))
{
perror("closedir");
return -1;
}
return 0;
}