#include <head.h>
int get_filePerrmison(mode_t mode)//获取文件权限
{
char per[] ="rwx";
for(int i=0;i<9;i++)
{
if((mode&(0400>>i))==0)
{
putchar('-');
continue;
}
putchar(per[i%3]);
}
}
int get_fileType(mode_t m) //获取文件类型
{
switch(m&S_IFMT)
{
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;
}
}
int main(int argc, const char *argv[])
{
printf("请输入目录名:\n");
char arr[50]="";
scanf("%s",arr);
char tmp[50]="";
strcpy(tmp,arr);
DIR* dirp=opendir(arr);
if(NULL==dirp)
{
ERR_MSG("opendir");
return -1;
}
struct dirent*rp=NULL;//读取路径下目录
while(1)
{
bzero(arr,sizeof(arr));
strcpy(arr,tmp);
rp =readdir(dirp);
if(NULL==rp)
{
if(0==errno)
{
break;
}
else
{
ERR_MSG("readdir");
}
}
if('.'==rp->d_name[0])
{
continue;
}
struct stat buf;
if(stat(strcat(arr,rp->d_name),&buf)<0)
{
ERR_MSG("open");
return -1;
}
struct tm* t;
t=localtime(&buf.st_ctime);
get_fileType(buf.st_mode);//提取文件类型
get_filePerrmison(buf.st_mode);//提取文件权限
printf(" %5lu",buf.st_nlink);//打印硬链接个数
struct passwd *pwd=getpwuid(buf.st_uid);
if(NULL==pwd)
{
ERR_MSG("getpwuid");
return -1;
}
int m=sizeof(pwd->pw_name);
printf(" %-*s",m,pwd->pw_name);
struct group *grp=getgrgid(buf.st_gid);
if(NULL==grp)
{
ERR_MSG("getgrgid");
return -1;
}
m=sizeof(grp->gr_name);
printf(" %-*s",m,grp->gr_name);
m=sizeof(buf.st_size)-1;
printf("%*ld",m,buf.st_size);
char *month_ch[]={"一","二","三","四","五","六","七","八","九","十","十一","十二"};
printf(" %s月",month_ch[t->tm_mon]);
printf(" %02d %02d:%02d",t->tm_mday,t->tm_hour,t->tm_min);
printf(" %s",rp->d_name);
putchar(10);
}
return 0;
}